获取反射的六种方式
1.已知一个类全名 Class.forName(classAllpath) 多用于读取配置文件
String classAllpath = "lesson02.Cat" ;
Class cls1 = Class . forName ( classAllpath) ;
System . out. println ( cls1) ;
2.类.class 多用于参数传递
Class cls2 = Cat . class ;
System . out. println ( cls2) ;
3.对象名.getClass()
Cat cat = new Cat ( ) ;
Class cls3 = cat. getClass ( ) ;
System . out. println ( cls3) ;
4.通过类加载器来获取
ClassLoader classLoader = cat. getClass ( ) . getClassLoader ( ) ;
Class cls4 = classLoader. loadClass ( classAllpath) ;
System . out. println ( cls4) ;
5.基本数据类型.class
Class < Integer > integerClass = int . class ;
System . out. println ( integerClass) ;
6.包装类.TYPE
Class < Integer > type = Integer . TYPE;
System . out. println ( type) ;
常用的方法
getClass() 显示运行类型
System . out. println ( cls1. getClass ( ) ) ;
getName() 获取…的名
System . out. println ( cls1. getName ( ) ) ;
getSimpleName() 获取简单类名
System . out. println ( cls1. getSimpleName ( ) ) ;
getPackage() 显示包
System . out. println ( cls1. getPackage ( ) . getName ( ) ) ;
newInstance() 通过反射创建对象实例
Object o = cls1. newInstance ( ) ;
Cat cat1 = ( Cat ) cls1. newInstance ( ) ;
System . out. println ( cat1) ;
getField(" ") 获取某个属性值 只能获取public修饰的 set(对象,值)修改某个属性的值
Field age = cls1. getField ( "age" ) ;
System . out. println ( age. get ( cat1) ) ;
age. set ( cat1, 20 ) ;
System . out. println ( age. get ( cat1) )
getFields() 获取属性数组 包括本类以及父类 只能获取public修饰的属性
Field [ ] fields = cls1. getFields ( ) ;
for ( Field field : fields) {
System . out. println ( field. getName ( ) ) ;
}
getDeclaredFields()获取本类中所有属性
Field [ ] declareField = cls1. getDeclaredFields ( ) ;
for ( Field field : declareField) {
System . out. println ( "本类所有属性:" + field. getName ( ) ) ;
}
getMethods() 获取public修饰的方法 包含本类及父类 及父类的父类
Method [ ] methods = cls1. getMethods ( ) ;
for ( Method method : methods) {
System . out. println ( "本类及父类的方法:" + method) ;
}
getDeclaredMethods() 获取本类中所有方法
Method [ ] declaredMethods = cls1. getDeclaredMethods ( ) ;
for ( Method declaredMethod : declaredMethods) {
System . out. println ( "本类中所有方法:" + declaredMethod. getName ( ) ) ;
}
getConstructor(xx.class,xx.class)获取某个public构造器
Constructor constructor = cls1. getConstructor ( String . class , int . class ) ;
System . out. println ( constructor) ;
getConstructors()获取本类的public修饰的构造器
Constructor [ ] constructors = cls1. getConstructors ( ) ;
for ( Constructor constructor2 : constructors) {
System . out. println ( "本类的构造器=" + constructor2) ;
}
getDeclaredConstructors() 获取本类中所有构造器
Constructor [ ] declaredConstructors = cls1. getDeclaredConstructors ( ) ;
for ( Constructor constructor2 : declaredConstructors) {
System . out. println ( "本类所有的构造器=" + constructor2) ;
}
getSuperclass() 获取父类的class
System . out. println ( "父类的class=" + cls1. getSuperclass ( ) ) ;
getInterfaces() 返回接口信息
Class [ ] interfaces = cls1. getInterfaces ( ) ;
for ( Class aninterface : interfaces) {
System . out. println ( aninterface) ;
}
getAnnotations() 返回注解信息
Annotation [ ] annotations = cls1. getAnnotations ( ) ;
for ( Annotation annotation : annotations) {
System . out. println ( "注解信息=" + annotation) ;
}
getModifiers()以int形式返回访问修饰符 默认修饰符是0 public是1 private是2 protected是4 static是8 final是16 修饰符的值可相加
declareField = cls1. getDeclaredFields ( ) ;
for ( Field field : declareField) {
System . out. println ( "本类所有属性:" + field. getName ( ) + "该属性的访问修饰符=" + field. getModifiers ( ) ) ;
}
getType()返回该属性的类型
declareField = cls1. getDeclaredFields ( ) ;
for ( Field field : declareField) {
System . out. println ( "本类所有属性:" + field. getName ( ) + "该属性的访问修饰符=" + field. getModifiers ( ) + "该属性的类型=" + field. getType ( ) ) ;
}
getReturnType()返回 方法的返回类型
declaredMethods = cls1. getDeclaredMethods ( ) ;
for ( Method declaredMethod : declaredMethods) {
System . out. println ( "本类中所有方法:" + declaredMethod. getName ( ) + "该方法的访问修饰符=" + declaredMethod. getModifiers ( ) + "该方法返回类型" + declaredMethod. getReturnType ( ) ) ;
}
本类中所有方法: toString该方法的访问修饰符= 1 该方法返回类型class java. lang. String
getParameterTypes() 返回这个方法/构造器的形参数组
创建实例的三种方法
1.通过public的无参构造器创建实例
Class cls = Class . forName ( "lesson02.User_" ) ;
Object o = cls. newInstance ( ) ;
System . out. println ( o) ;
2.通过public的有参构造器创建实例
Constructor constructor = cls. getConstructor ( String . class ) ;
Object o1 = constructor. newInstance ( "李四" ) ;
System . out. println ( o1) ;
3.通过非public的有参构造器创建实例
Constructor constructor1 = cls. getDeclaredConstructor ( int . class , String . class ) ;
constructor1. setAccessible ( true ) ;
Object o2 = constructor1. newInstance ( 100 , "王二" ) ;
System . out. println ( o2) ;
通过反射访问类中成员
1.访问public成员
Class cls = Class . forName ( "lesson02.Student02" ) ;
Object o = cls. newInstance ( ) ;
Field age = cls. getField ( "age" ) ;
age. set ( o, 88 ) ;
System . out. println ( o) ;
System . out. println ( age. get ( o) ) ;
2.访问非public成员
Field name = cls. getDeclaredField ( "name" ) ;
name. setAccessible ( true ) ;
name. set ( o, "张三" ) ;
System . out. println ( o) ;
3.访问静态成员时,get和set中的参数o可以写成null
name. set ( null , "李四" ) ;
System . out. println ( o) ;
System . out. println ( name. get ( null ) ) ;
通过反射访问方法时
1.访问public方法
Class cls = Class . forName ( "lesson02.Boss" ) ;
Object o = cls. newInstance ( ) ;
Method hi = cls. getMethod ( "hi" , String . class ) ;
hi. invoke ( o, "反射要结束了" ) ;
2.访问非public方法
Method say = cls. getDeclaredMethod ( "say" , int . class , String . class , char . class ) ;
say. setAccessible ( true ) ;
System . out. println ( say. invoke ( o, 100 , "张三" , 'a' ) ) ;
3.访问静态方法
System . out. println ( say. invoke ( null , 200 , "李四" , 'b' ) ) ;
在反射中,如果方法有返回值,统一返回Object,但是运行类型和方法中定义的放回类型一致
Object return_ = say. invoke ( null , 300 , "王二" , 'c' ) ;
System . out. println ( "运行类型是:" + return_. getClass ( ) ) ;