Java反射
java反射
java反射提供的功能
- 在运行时判断任意一个对象所属的类
- 在运行时构造任意一个类的对象
- 在运行时判断任意一个类所具有的成员变量和方法
- 在运行时获取泛型信息
- 在运行时调用任意一个对象的成员变量和方法
- 在运行时处理注解
- 生成动态代理
获得Class实例
Class实例唯一
- Class clazz1 = Object.class;
- Class clazz2 = new Object().getClass();
- Class clazz3 = Class.forName("[类的全限定类名]");
- Class clazz4 = [系统类加载器].loadClass("[类的全限定类名]");
那些类型有Class对象
类、接口、数组、枚举、注解、基本数据类型、void
读取配置文件
Properties pros = new Properties();
方式一 {
FileInputStream fis = new FileInputStream("[文件路径]");
pros.load(fis);
}
方式二{
InputStream is = [系统类加载器].getResourceAsStream("[文件路径]");
is.load(fis);
}
String [属性值引用] = pros.getProperty("[属性键]");
反射API
属性 【权限修饰符 数据类型 变量名】
//获得当前运行时类及父类声明为public访问权限的属性
Field[] fields= [Class对象].getFields():
//获得当前运行时类声明的所有属性(不包含父类的属性)
Field[] fields=[Class对象].getDeclaredFields():
//获得权限修饰符 , Modifier,返回0,1
int m = [Field].getModifiers();
//返回对象权限字符串
String str =Modifier.toString(m);
//获得数据类型
Class type = [Field].getType();
//变量名
String n = [Field].getName();
方法 【 @Xxxx 权限修饰符 返回值类型 方法名(参数类型1 形参1 , 参数类型2 形参2,...)thorws XxxException{... } 】
//获得当前运行时类及父类声明为public访问权限的方法
Method[] ms = [Class对象].getMethods();
//获得当前运行时类声明的所有方法(不包含父类的方法)
Method[] ms = [Class对象].getDeclaredMethods();
//获得方法声明注解(只能获得RetentionPolicy.Runtime)
Annotation[] as = [Method].getAnnotation();
//权限修饰符同属性
getModifier()
//返回值类型
String str = [Method].getReturnType().getName();
//方法名同属性
getName()
//形参列表 要先判断有无参数列表再进行后续操作
Class[] cs = [Method].getParameterTypes();
//参数类型
[Class]c.getName();
// 形参名
Parameter[] parameters = [Method].getParameters();
[Parameter].getName();
//抛出的异常 要先判断是否抛出异常再进行后续操作
Class[] es = [Method].getExceptionTypes();
[Class].getName();
构造器
//获取当前运行时类中声明为public的构造器
Constructor[] cs = [Class对象].getConstructors();
//获取当前运行时类中声明的所有构造器
Constructor[] cs = [Class对象].getDeclaredConstructors();
类的父类
//获取运行时类的父类
Class c = [Class对象].getSuperclass();
//获取运行时带泛型类的父类
Type t = [Class对象].getGenericSuperclass();
////获取运行时带泛型类的父类的泛型
ParameterizedType p = (ParameterizedType) t;
Type[] ts = p.getActualTypeArguments();
ts[i].getTypeName();
((Class)ts[i]).getName();
类实现的接口
Class[] cs = [Class对象].getInterfaces();
类所在包
Package p = [Class对象].getPackage();
类所声明的注解
Annotation[] as = [Class对象].getAnnotations();
设置执行
(私有的 需setAccessible(true)保证可访问)
属性设置 [Field].set([Class对象],[设置值])
属性获得 [Field].get(([Class对象])
方法执行(有返回值与方法相同,无返回值null)
[Method].invoke(([Class对象],[形参值])
静态属性设置/获得 Class对象可以为null
静态方法执行 Class对象可以为null [Method].invoke(null)
反射代码
//反射创建对象
Class clazz = Person.class;
Constructor constructor =
clazz.getConstructor(String.class,int.class);
Object newInstance = constructor.newInstance("Tom",123);
System.out.println(newInstance);
//反射调用对象指定的属性、方法
Field declaredField = clazz.getDeclaredField("age");
Field field = clazz.getField("age");
Field declaredField2 = clazz.getDeclaredField("name");
declaredField2.setAccessible(true);
System.out.println(declaredField2.get(newInstance));
declaredField.set(newInstance, 10);
System.out.println(field.get(newInstance));
//反射调用对象方法
Method declaredMethod = clazz.getDeclaredMethod("show");
declaredMethod.invoke(newInstance);
Method declaredMethod2 =
clazz.getDeclaredMethod("showNation",String.class);
declaredMethod2.setAccessible(true);
declaredMethod2.invoke(newInstance, "China");
//反射调用私有构造
Constructor declaredConstructor =
clazz.getDeclaredConstructor(int.class);
declaredConstructor.setAccessible(true);
Object newInstance2 = declaredConstructor.newInstance(20);
System.out.println(newInstance2);
浙公网安备 33010602011771号