利用反射API,获取类的信息(类的名字,属性,方法,构造器等)
Class gettedClass=Class.forName("packgeName.className");
获取包名+类名:
gettedClass.getName()
获取类名:
gettedClass.getSimpleName()
获取属性
gettedClass.getFields() 只能是public
gettedClass.getFields("fieldName") 只能是public
gettedClass.getDeclaredFields() 所有声明的属性
gettedClass.getDeclaredFields("fieldName") 所有声明的属性
获取方法:
gettedClass.getMethod()
gettedClass.getMethod("methodName",parameterType)
gettedClass.getDeclaredMethod()
gettedClass.getDeclaredMethod("methodName",parameterType)
其中的type.class 例如 int.class
获取构造器
gettedClass.getConstructor()
gettedClass.getConstructor(parameter)
gettedClass.getDeclaredConstructor()
gettedClass.getDeclaredConstructor(parameter)
通过反射API动态操作:构造器,方法,属性
Class<Source> gettedClass=(Class<Source>)Class.forName("testReflect.Source");
动态创建对象:
//调用无参构造函数,所以在javabean中,无参构造函数是很重要的
Source source=gettedClass.newInstance();
Constructor<Source> constructor=gettedClass.getDeclaredConstructor(String.class,int.class);
Source source=constructor.newInstance("good",21);
//动态调用方法
Method method=gettedClass.getMethod("setName",String.class);
method.invoke(source,"great");
//动态修改属性
Field field=gettedClass.getDeclaredField("fieldName");
field.set(source,"good");
Class gettedClass=Class.forName("packgeName.className");
获取包名+类名:
gettedClass.getName()
获取类名:
gettedClass.getSimpleName()
获取属性
gettedClass.getFields() 只能是public
gettedClass.getFields("fieldName") 只能是public
gettedClass.getDeclaredFields() 所有声明的属性
gettedClass.getDeclaredFields("fieldName") 所有声明的属性
获取方法:
gettedClass.getMethod()
gettedClass.getMethod("methodName",parameterType)
gettedClass.getDeclaredMethod()
gettedClass.getDeclaredMethod("methodName",parameterType)
其中的type.class 例如 int.class
获取构造器
gettedClass.getConstructor()
gettedClass.getConstructor(parameter)
gettedClass.getDeclaredConstructor()
gettedClass.getDeclaredConstructor(parameter)
通过反射API动态操作:构造器,方法,属性
Class<Source> gettedClass=(Class<Source>)Class.forName("testReflect.Source");
动态创建对象:
//调用无参构造函数,所以在javabean中,无参构造函数是很重要的
Source source=gettedClass.newInstance();
Constructor<Source> constructor=gettedClass.getDeclaredConstructor(String.class,int.class);
Source source=constructor.newInstance("good",21);
//动态调用方法
Method method=gettedClass.getMethod("setName",String.class);
method.invoke(source,"great");
//动态修改属性
Field field=gettedClass.getDeclaredField("fieldName");
field.set(source,"good");
在操作私有的属性或方法时,可以利用该属性或方法的setAccessible(true)方法来禁用安全检查,因此可以直接操作私有的属性或方法
setAccessible
启用和禁用访问安全检查的开关,值为为true,则指示反射的对象在使用时应该取消Java语言访问检查,值为false则指示反射的对象应该实施Java语言访问检查
禁止安全检查,可以提高反射的运行速度