java的反射

一.Class类
1.万物皆对象,对象时类的实例,类是java.lang.Class的实例(对象)

2.如何获取Class类的类对象,三种方法
Class的构造方法时私有的,所有不能通过的new的方式创建
1.使用类都有的静态成员变量class,格式:类名.class;
Class u1 = User.class;
2.使用类的实例对象的getClass()方法,格式:对象.getClass();
Class u2 = user.getClass();
3.通过Class类的静态方法,会抛异常
Class u3 = Class.forName(“com.tiglle.User”);

3.Class类的实例的特点
1.官方定义,一个Class类的实例为此类的 类类型:class type
Class u = User.class;
c为User的类类型
2.同一个类的不同Class类的实例相等
Class u1 = User.class;
Class u2 = user.getClass();
Class u3 = Class.forName(“com.tiglle.User”);
u1==u2==u3 结果是true

4.通过类的类类型创建类的实例对象,需要此类有无参数的构造方法
Class c = User.Class();
User user = (User) c.newInstance();
会抛异常,返回为Object

二.静态加载类和动态加载类
1.静态加载类:编译时刻加载类
User u = new User();
new创建对象 是静态加载类,在编译时就加载了所有可能要用到的类

2.动态加载类:运行时刻加载类
Class.forName(“com.tiglle.User”);
Class.forName() 在运行时才会加载要用到的类

三.Class实例获取类的信息
1.基本数据类型的 Class实例(类类型)
Class c1 = int.class;
Class c2 = String.class;
Class c3 = double.class
Class c4 = void.class;

2.获取类的信息
Class c = User.class;
1.获取类的名称
c.getName():带包名的名称
c.getSimpleName():不带包名的名称
2.获取类的方法
Method也是Class类的实例:java.lang.Method
Method[] m = c.getMethods():获取所有public权限的方法,包括父类继承的
Method[] m = c.getDeclaredMethods():获取所有权限的本类的方法
Method m = c.getDeclaredMethods(“方法名”,”参数列表1”,”参数列表2”);
Method m = c.getDeclaredMethods(“say”,”int.class”,”String.class”);
Class returnType = m[0].getReturnType():获取方法的返回值类型 的类类型
returnType.getName():获取返回值的名称
m[0].getName():获取方法名
Class[] paramClass = m[0].getParameterTypes():获取参数列表类类型的数组(int.class ,String.class,…)
paramClass[0].getName():参数列表第一个参数的类名

3.获取类的成员变量的信息
成员变量也是Class类的实例:java.lang.reflect.Field
Field封装了关于成员变量的所有操作
Class c = User.Class
1.Field[] fs = c.getFields():获取所有的public的成员变量的信息,包括从父类继承的
2.Field[] fs = c.getDeclaredFields():不限制访问权限获取所有自己声明的成员变量的信息
1.Class fieldType = fs[0].getType():得到成员变量的类型的Class实例(类的类类型)
2.String fieldName = field.getName():得到成员变量的名称
2.String typeName = fieldType.getName():获取成员变量的类型的类名称

4.获取构造方法的信息
构造函数也是对象:java.lang.Constructor
Class c = User.class;
1.Constructor[] cons = c.getConstructors():获取所有构造方法的数组
2.Constructor[] cons = c.getDeclaredConstructors():获取所有自己生命的构造函数(和上面的区别暂时没懂)
String name = cons[0].getName():获取构造函数的函数名
Class[] paramClass = cons[0].getParameterTypes():获取构造方法的参数列表的类的类类型的数组
paramClass[0].getName():获取参数1的类名

四.方法的反射
1.方法反射的使用
Class c = User.class;
Method m = c.getDeclaredMethods(“方法名”,”参数列表1的类类型”,”参数列表2的类类型”);
Method m = c.getDeclaredMethods(“say”,”int.class”,”String.class”);
调用=new User().方法名(“参数列表1”,”参数列表2”);
Object o(返回值,如果没返回值为null) = m.invoke(“调用谁方法(对象)”,”参数列表1”,”参数列表2”);

2.使用方法的反射绕过编译期间泛型的检测
//只能加String的list
List list = new ArrayList();
list.add(“xiaoming”);
Class listClass = list.getClass();
Method m = listClass.getMethod(“add”,Object.class);
//使用泛型绕过反射的检测,添加int类型
Object o = m.invoke(list,2);
System.out.println(list);
结果:
[xiaoming, 3]
此时不能使用forEach循环集合

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值