反射(Reflection)
可以在运行时加载,使用未知的包,类,方法等等
弥补强类型语言的不足
基于反射创建对象
- Class.forname('A').newInstance();
- A.class.newInstance();
- A.class.getConstructor.newInstance();
class A{
public void hello(){
System.out.println("hello");
}
}
public class ReflectStudy {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
Object object = Class.forName("reflectstudy.A").newInstance();
Method method = Class.forName("reflectstudy.A").getMethod("hello");
method.invoke(object);
Object object2 = A.class.newInstance();
Constructor<A> constructor = A.class.getConstructor();
Object object3 = constructor.newInstance();
}
}
反射关键类
Class
获取方式:
- obj.getClass();
- Class.forName();
- SomeClass.class;
Class c = A.class;
Class 可以获取:
- 成员变量 Field
c.getFields();//获取所有公有字段
c.getDeclaredFields();// 获取所有非继承的字段,包括私有字段
- 方法 Method
- 构造函数 Constructor
- 修饰符 Modifiers
- 包 Package
- 父类 SuperClass
- 父接口 SuperInterfaces
- 等等
网友评论