目录
1.反射的定义
-
程序可以访问、检测和修改它本身状态或行为的一种能力
-
在程序运行时,可以通过反射了解类的信息 和 使用类
-
了解类的哪些信息呢?
-
类的基本信息(类名,修饰符,实现接口,继承的父类,所属的包,使用的注解)
-
类的构造方法信息 (修饰符,方法名,参数列表,异常声明,注意:没有方法体)
-
类的属性信息(修饰符,属性类型,属性名)
-
类的普通方法信息(修饰符,返回类型,方法名,参数列表,异常声明,注意:没有方法体)
-
-
如何实用类?
-
创建对象
-
调用对象的方法
-
调用对象的属性
-
-
为什么要通过反射了解类信息,要操作类对象?
-
做封装工具或框架时,会使用的放射
-
封装中有一部分功能时固定的,有一部分功能需要按照使用者的需求来实现
-
使用者如何将我们的需求告诉框架,从而让框架按照我们的需求来完成操作
-
传参
-
配置(文件)
-
约定大于配置
-
-
如果不同的使用者,有不同的类操作需求,就会应用到反射了。
-
-
2.反射的应用
与反射相关的类一般都在 java.lang.reflect
包中
2.1 获得Class对象
-
Class对象是反射应用的基石,必须要先获得Class对象,才能完成后续的反射操作
-
在JVM加载类信息时,会经过一系列的处理,最终将类信息存在方法区,并且为之生成一个Class对象,作用方法区类信息的访问入口
-
将Class对象理解成类模板
-
如何获得Class对象? 有三种方式
-
Class c ="类名".getClass()
getClass是Object类的方法
-
Class c = String.class ;
-
Class c = Class.forName("java.lang.String");
-
2.2 获得类对象
获得类的基本信息
-
Class可以代表类或接口
-
提供了一些方法可以获得类的基本信息
c.getName();//获得类长名
c.getSimpleName();//获得类短名
c.getModifiers();//获得修饰符组合的数字和
//Modifier.toString( c.getModifiers() ) 获得修饰符关键字
c.getSuperClass();//获得父类
c.getInterfaces();//获得接口数组
c.getPackage();//获得包对象
//package.getName() 获得包名
public static void main(String[] args) {
Class<A> c = A.class;
System.out.println(c.getName()); //获得类长名(带包路径)
System.out.println(c.getSimpleName()); //获得类短名
//访问权限也算修饰符
//该方法获得的是修饰符组合的数字和
System.out.println(Modifier.toString(c.getModifiers()));
Class sc = c.getSuperclass();
System.out.println(sc.getName()); //java.lang.Object
Class<?>[] ics = c.getInterfaces();
for(Class ic : ics){
System.out.println(ic.getName());//序列化,克隆
}
Package p = c.getPackage();
System.out.println(p.getName());
}
获得属性信息
类的属性信息,都是用Field
对象表示
c.getFields();//获得所有属性对象(公共的,从父类继承的)
c.getField(name);//获得指定名字的属性对象
c.getDeclaredFields();//获得本类所有权限的属性对象
c.getDeclaredField(name);
field.getName();//获得属性名
field.getModifiers();//获得属性修饰符
field.getType();//获得属性类型
public static void main(String[] args) throws NoSuchFieldException {
Class c = A.class ;
//获得指定名字的属性
//与getFields方法一同,只能获得public的属性,可以是自己的也可以是继承来的
Field field = c.getField("n");
System.out.println(field.getName());
System.out.println(field.getType());
System.out.println(Modifier.toString( field.getModifiers() ));
System.out.println("--------------------------------");
Field[] fields = c.getFields();
for(Field f : fields){
System.out.println(f.getName());
System.out.println(f.getType());
System.out.println(Modifier.toString( f.getModifiers() ));
}
System.out.println("--------------------------------");
//与getDeclaredField()一同,可以获得当前类的所有权限的属性,但不能获得继承属性
fields = c.getDeclaredFields() ;
for(Field f : fields){
System.out.println(f.getName());
System.out.println(f.getType());
System.out.println(Modifier.toString( f.getModifiers() ));
}
}
获得方法信息
c.getMethods(); //获得所有的public方法,可以继承的
c.getDeclaredMethods();//获得本类所有权限的方法
c.getMethod(name,Class...paramTypes) ;//根据指定的方法名和参数列表类型获得只当的方法
//c.getMethod("t1"); t1()
//c.getMethod("t1",int.class); t1(int)
//c.getMethod("t1",int.class,String.class) t1(i,s)
c.getDeclaredMethod(name , Class...pts) ;
method.getName();//获得方法名
method.getModifiers();
method.getReturnType();//获得返回类型
method.getParameterCount();//获得参数数量
method.getParameterTypes();//获得参数列表类型 返回Class[]
method.getParameters();//获得参数列表对象 返回Parameter[]
//parameter.getName();获得参数名
//parameter.getType();获得参数类型
//parameter.getModifiers();获得参数修饰符
method.getExceptionTypes();//获得异常声明列表
public static void main(String[] args) throws NoSuchMethodException {
Class c = A.class ;
//Method t1 = c.getMethod("t1",int.class);
Method[] ts = c.getMethods() ;
for(Method t1 : ts) {
System.out.println(t1.getName()); //方法名
System.out.println(t1.getReturnType()); //返回类型
System.out.println(Modifier.toString(t1.getModifiers())); //修饰符
Parameter[] parameters = t1.getParameters();
System.out.println(parameters.length); //参数个数
System.out.println(t1.getParameterCount());
for (Parameter parameter : parameters) {
System.out.println(parameter.getName());//参数名(*)
System.out.println(parameter.getType());//参数类型
System.out.println(Modifier.toString(parameter.getModifiers()));
}
Class<?>[] ets = t1.getExceptionTypes();
System.out.println(ets.length);//异常个数
for (Class e : ets) {
System.out.println(e.getName());
}
System.out.println("-------------------------------------");
}
}
获得构造方法信息
c.getConstructors();//获得所有公共的构造方法(本类和继承的)
c.getConstructor(Class...pts);//根据参数列表类型获得指定的构造方法
c.getDeclaredConstructors();
c.getDeclaredConstructor(Class...pts);
constructor.getName();//获得方法名
constructor.getModifiers();
constructor.getParameterCount();//获得参数数量
constructor.getParameterTypes();//获得参数列表类型 返回Class[]
constructor.getParameters();//获得参数列表对象 返回Parameter[]
//parameter.getName();获得参数名
//parameter.getType();获得参数类型
//parameter.getModifiers();获得参数修饰符
constructor.getExceptionTypes();//获得异常声明列表
标签:反射,获得,getName,System,----,应用,println,Class,out
From: https://blog.csdn.net/lzp122390/article/details/142626773