java 反射机制概论
一:通过反射机制,在运行状态时,可以获取到一个类的所有的属性和方法(包括私有的方法和属性
二:使用反射机制,需要先获取到该类对应的字节码文件对象,也就是.class文件对象
获取字节码文件对象方式 该类所处阶段 Class clazz1 = Class.forName(“类名地址”); 源文件阶段 Class clazz1 = Animal.class; 字节码阶段 Class clazz1 = a.getClass(); 创建对象阶段
话不多说,直接上代码~
一:获取类的字节码文件对象
public class Animal implements AnimalInterface {
private String sport;
public String age;
@Override
public void name ( ) {
System. out. println ( "我是鹿~~" ) ;
}
}
public class reflectPractice {
public static void main ( String[ ] args) throws ClassNotFoundException {
Class class1 = Animal. class ;
Class class2 = Class. forName ( "com.zdp.csdn.zdpcsdn.reflect.Animal" ) ;
System. out. println ( class1) ;
System. out. println ( class2) ;
Animal a= new Animal ( ) ;
Class class3 = a. getClass ( ) ;
System. out. println ( class3) ;
}
}
二:通过无参构造方式,创建类的对象
Class class1 = Class. forName ( "com.zdp.csdn.zdpcsdn.reflect.Animal" ) ;
Animal animal= ( Animal) class1. newInstance ( ) ;
System. out. println ( animal) ;
二:通过无参构造方式,需要先获取制定类的构造器方法,然后创建类的对象
Class class1 = Class. forName ( "com.zdp.csdn.zdpcsdn.reflect.Animal" ) ;
Constructor constructor = class1. getConstructor ( String. class , String. class ) ;
Animal animal1= ( Animal) constructor. newInstance ( "游泳" , "17" ) ;
System. out. println ( animal1. getAge ( ) + animal1. getSport ( ) ) ;
四:获取所有的构造方法
Constructor[ ] constructors= class1. getConstructors ( ) ;
for ( Constructor constructor1: constructors) {
System. out. println ( constructor1. getName ( ) ) ;
Class[ ] ParameterType = constructor1. getParameterTypes ( ) ;
for ( int i= 0 ; i< ParameterType. length; i++ ) {
System. out. println ( constructor1. getName ( ) + "----" + i+ ParameterType[ i] . getName ( ) ) ;
}
}
五:获取类的属性值,并赋值
Field field= class1. getField ( "age" ) ;
Field field1= class1. getDeclaredField ( "sport" ) ;
field1. setAccessible ( true ) ;
field1. set ( animal1, "奔跑" ) ;
System. out. println ( field1. get ( animal1) ) ;
六:获取类的所有属性,打印属性值
Field[ ] fields= class1. getDeclaredFields ( ) ;
for ( Field field2: fields) {
field2. setAccessible ( true ) ;
System. out. println ( field2. get ( animal1) ) ;
}
七:获取method 并使用
package com. zdp. csdn. zdpcsdn. reflect;
public class Animal implements AnimalInterface {
private String sport;
public String age;
public Animal ( ) {
}
public Animal ( String sport, String age) {
this . sport = sport;
this . age = age;
}
public String getSport ( ) {
return sport;
}
public void setSport ( String sport) {
this . sport = sport;
}
public String getAge ( ) {
return age;
}
public void setAge ( String age) {
this . age = age;
}
@Override
public void name ( String c, int b) {
System. out. println ( "我是" + c+ "今年" + b+ "岁了~" ) ;
}
private void sex ( String sex) {
System. out. println ( "我是" + sex) ;
}
}
Method method= class1. getMethod ( "name" , new Class [ ] { String. class , int . class } ) ;
System. out. println ( method. getName ( ) ) ;
Method method1= class1. getDeclaredMethod ( "sex" , String. class ) ;
System. out. println ( method1. getName ( ) ) ;
Object object= method. invoke ( animal1, "大象" , 999 ) ;
method1. setAccessible ( true ) ;
method1. invoke ( animal1, "男生" ) ;
八:获取所有的方法,并获取所有的方法参数列表
Method[ ] methods= class1. getDeclaredMethods ( ) ;
for ( Method method2: methods) {
System. out. println ( method2+ "==========" ) ;
method2. setAccessible ( true ) ;
Class[ ] classes= method2. getParameterTypes ( ) ;
for ( Class c : classes) {
System. out. println ( c. getName ( ) ) ;
}
}
九:获取父类和实现的接口
* /
Class[ ] classes= class1. getInterfaces ( ) ;
Class superclass = class1. getSuperclass ( ) ;
System. out. println ( superclass) ;
for ( Class c : classes) {
System. out. println ( c. getName ( ) ) ;
}
十:获取该类对应的路径
URL url= class1. getResource ( "" ) ;
URL url1= class1. getResource ( "/" ) ;
URL url2= class1. getResource ( "Animal.Class" ) ;
URL url3= class1. getResource ( "/Animal.Class" ) ;
System. out. println ( url) ;
System. out. println ( url1) ;
System. out. println ( url2) ;
System. out. println ( url3) ;
补充知识点
Method[] methods = c.getMethods(); // 获取自己的包括父亲的所有公共方法。 Method[] methods = c.getDeclaredMethods(); // 获取自己的所有的方法
END