反射原理了解

2022-12-29  本文已影响0人  双囍_小赵

1.反射为什么比直接调用会耗时?

2.反射为什么耗性能?

往下看:

获取方法

获取Class对象的方法集合,主要有三种方法:

getDeclaredMethods(): 返回类或接口声明的所有方法:

包括公共,保护,默认(包)访问和私有方法不包括继承的方法

public Method[] getDeclaredMethods() throws SecurityException {}

getMethods(): 返回某个类所有的public方法,

包括继承类的public方法

public Method[] getMethods() throws SecurityException {}

getMethod(): 返回一个特定的方法

第一个参数 :方法名称

后面的参数 :方法的参数对应Class的对象

public Method getMethod(String name,Class... parameterType) {}

获得Class对象

使用Class类的forName静态方法:

public static Class forName(String className);/* 在JDBC中使用这个方法加载数据库驱动 */

Class.forName(driver);

直接获取一个对象的class:

Class klass=int.class;

Class classInt=Integer.TYPE;

调用对象的getClass()方法:

StringBuilder str=new StringBuilder("A");

Class klass=str.getClass();

判断是否是某个类的实例

一般来说,使用instanceof关键字判断是否为某个类的实例

在反射中,可以使用Class对象的isInstance() 方法来判断是否为某个类的实例,这是一个native方法

public native boolean isInstance(Object obj);

创建实例

通过反射生成对象的实例主要有两种方式:

使用Class对象的newInstance()方法来创建Class对象对应类的实例:

Class c = String.class;

Object str = c.newInstance();

先通过Class对象获取指定的Constructor对象,再调用Constructor对象的newInstance()方法来创建实例: 可以用指定的构造器构造类的实例

/* 获取String所对应的Class对象 */

Class c=String.class;/* 获取String类带一个String参数的构造器 */

Constructor constructor=c.getConstructor(String.class);/* 根据构造器创建实例 */

Object obj=constructor.newInstance("abc");

System.out.println(obj);


获取构造器信息

通过Class类的getConstructor方法得到Constructor类的一个实例

Constructor类中newInstance方法可以创建一个对象的实例:

public T newInstance(Objec ... initargs)

newInstance方法可以根据传入的参数来调用对应的Constructor创建对象的实例


获取类的成员变量信息

getFileds: 获取公有的成员变量

getDeclaredFields: 获取所有已声明的成员变量,但是不能得到父类的成员变量


调用方法

从类中获取一个方法后,可以使用invoke() 来调用这个方法

public Object invoke(Object obj, Object ... args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {}

示例:

public class InvokeTest {

public static void main(String[] args) throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {

Class klass = methodClass.class;

// 创建methodClass的实例

Object obj = klass.newInstance();

// 获取methodClass的add方法

Method method = klass.getMethod("add", int.class, int.class);

// 调用method对应的方法,实现add(1,4)

Object result = method.invoke(obj, 1, 4);

System.out.println(result);

}

}

class methodClass {

public final int n = 3;

public int add(int a, int b) {

return a + b;

}

public int sub(int a,int b) {

return a * b;

}

}

上一篇 下一篇

猜你喜欢

热点阅读