Java反射

java反射

java反射提供的功能

  • 在运行时判断任意一个对象所属的类
  • 在运行时构造任意一个类的对象
  • 在运行时判断任意一个类所具有的成员变量和方法
  • 在运行时获取泛型信息
  • 在运行时调用任意一个对象的成员变量和方法
  • 在运行时处理注解
  • 生成动态代理

获得Class实例

Class实例唯一

  1. Class clazz1 = Object.class;
  2. Class clazz2 = new Object().getClass();
  3. Class clazz3 = Class.forName("[类的全限定类名]");
  4. 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);

posted @ 2021-01-13 13:05  DragonK  阅读(92)  评论(0)    收藏  举报