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;
}
}
网友评论