反射的作用
1)运行时构造类对象;
2)运行时调用对象方法。
3)运行时判断对象所属的类;
4)运行时判断任意一个类所具有的成员变量和方法;
5)反射API可以获取程序在运行时刻的内部结构。
6)使用反射的一个最大的弊端是性能比较差。相同的操作,用反射API所需的时间大概比直接的使用要慢一两个数量级。
这个反射中还有两个方法有时候问到:
@CallerSensitive
public Method[] getMethods() throws SecurityException {
checkMemberAccess(Member.PUBLIC, Reflection.getCallerClass(), true);
return copyMethods(privateGetPublicMethods());
}
@CallerSensitive
public Method[] getDeclaredMethods() throws SecurityException {
checkMemberAccess(Member.DECLARED, Reflection.getCallerClass(), true);
return copyMethods(privateGetDeclaredMethods(false));
}
getMethods 与 getDeclaredMethods 的区别
public Method[] getMethods()返回某个类的所有公用(public)方法包括其继承类的公用方法,当然也包括它所实现接口的方法。
public Method[] getDeclaredMethods()对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。当然也包括它所实现接口的方法。
Class类
可以通过以下三种方式获得Class对象:
1)使用Class类的静态方法forName:Class.forName("cn.ys.test.TestReflect");
2)使用类的.class语法:Class<?> clazz = TestReflect.class;
3)使用对象的getClass()方法:String s = "111";s.getClass();
4)对于包装类(8个)可以通过.TYPE语法方式 (小编注:
Integer.class返回的是Integer类所对应的Class对象;
Integer.TYPE返回的是基本类型 int的Class实例;)
Constructor类
Constructor类代表某个类中的一个构造方法。
得到某个类所有的构造方法的方式通常为:
//获取一个类的所有构造方法
Constructor[] constructor = Class.forName("java.lang.String").getConstructors();
//获取一个类的某个构造方法
Constructor constructor1 = Class.forName("java.lang.String").getConstructor(String.class);
其他类其实见的少,最还有个比较重要的就是
通过Class类实例化对象
方法一:实例化无参构造的类并调用方法(一般用第一种就好了)
Class clazz = TestNK.class;Object obj = clazz.newInstance();
方法二:获取Constructor对象,在调用他下面的newInstance()方法
Class clazz = TestNK.class; Constructor constructor = clazz.getConstructor(new Class[]{}); Object obj = constructor.newInstance(new Class[]{});