反射笔记

反射

reflection library

reflective:能分析类的能力的程序

参考:https://www.zhihu.com/question/377483107/answer/1079967402

https://www.w3cschool.cn/java/java-reflex.html

学习方法:学习一项新的技术之前,请先搞清楚为什么要学这个新的东西?

重点掌握

获取Class的几种方式

通过Class创建对象,获取构造器、成员变量、方法

通过反射API修改成员变量的值,调用方法	      

Class类的主要API

成员变量--Field

方法--Method

构造器--Constructor
一)获得Class类的方式(手工地加载某个类)

1.Object类的getClass()方法

Random r = new Random();
Class<?> rClass = r.getClass();
System.out.println(rClass);//class java.util.Random
System.out.println(rClass.getName());//java.util.Random

2.Class类中的静态方法 public static Class ForName(String className)

Class clazz = Class.forName("com.pengluo.User");//参数:完整路径的包名和类名

父类对象clazz.getSuperclass()

实现的接口clazz.getInterfaces()

3.任意类型.class

Class c1 = int.class;
Class c2 = Double[].class;
Class c3 = ArrayList.class;
二)实例一个Class类的对象
//方法一:默认构造方法
User u1 = (User) clazz.newInstance();
//set方法赋值
u1.setName("pengluo");
u1.setSex("male");


//方法二:获取全部的构造函数,选择一个构造函数创建对象
Constructor<?> cons[] = clazz.getConstructors();

user = (user) cons[0].newInstance("Rollen");

三)获取Class类的成员变量(属性)

1: 获取Class对象

2:通过Class对象获取Constructor对象

3:Object obj = Constructor.newInstance()创建对象

4:Field field = Class.getField("指定变量名")获取单个成员变量对象

5:field.get(obj) 获取obj对象的field字段的值

6:field.set(obj,"") 为obj对象的field字段赋值

Field[] Fieds = clazz.getFields();//获得类以及从超类(父类)中继承到的公共域
Field[] Fieds = clazz.getDeclaredFields();//获得类中声明的全部域,包括私有的
//遍历输出
for (int i = 0; i <Fieds.length ; i++) {
            String name = Fieds[i].getName();
            String Type = Fieds[i].getType().getName();
            System.out.println(name+":"+Type);
}

Field name = clazz.getDeclaredField("name");//获取Class类的特定的成员变量(属性)
四)获取Class类的方法
Method method[] = clazz.getMethods();//获得类以及从超类(父类)中继承到的公有方法
Method method[] = clazz.getDeclaredMethods();//获得类中声明的全部方法,包括私有的
Method method = clazz.getMethod();//获取Class类的某个指定的方法
//如果调用的是私有方法那么需要暴力访问        
method.setAccessiable(true);
ArrayList<Integer> list = new ArrayList<Integer>();
Method method10 = list.getClass().getMethod("add",Object.class);
method10.invoke(list,"Java反射机制实例。");
posted @ 2020-09-24 20:28  米罗{mirror}  阅读(111)  评论(0编辑  收藏  举报