反射是java提供的一个重要功能,可以在运行时检查类、接口、方法和变量等信息,无需知道类的名字,方法名等。还可以在运行时实例化新对象,调用方法以及设置和获取变量值。反射非常强大和有用,很多java框架中都有反射的影子,例如spring、mybatis等等,JDBC利用反射将数据库的表字段映射到java对象的getter/setter方法。Jackson, GSON, Boon等类库也是利用反射将JSON文件的属性映射到java对的象getter/setter方法。可见,只要使用java,反射就无处不在。
反射的常用对象了解
Class
Class类的实例表示正在运行的java应用程序中的类和接口;
Constructor
是java.lang.reflect.Executable类的直接子类,用于表示类的构造方法。通过Class对象的getConstructors()方法可以获得当前运行时类的构造方法
Field
用于封装成员变量信息,调用Class对象的getField()方法或getFields()可以获得当前运行时类的指定成员变量或所有成员变量,以及对它的动态访问权限
Method
是java.lang.reflect.Executable类的直接子类,用于封装成员方法的信息,调用Class对象的getMethod()方法或getMethods()方法可以获得当前运行时类的指定方法或所有方法
一,Class类
java中java.long。Class用于表示类的字节码(.class)文件
如何获得class文件对应的Class对象
1,已知类和对子昂的情况下:类名.class;对象.getClass() -Objiect类提供
Class class1 = Animal.class;
Animal animal = Aniaml();
Class class1 = animal.getClass()
2未知类和对象的情况下:Class.forName("包名.类名")//(推荐使用)
Class class = Class.forName("反射.Animal")
二,Constructor
Class claa1 = Class.forName("反射.Animal")
1,获取所有构造方法
Constructor [] constructor = Class1.forName("反射.Animal").getConstructor()
2,获取指定构造方法并实例化
Constructor constructor = Class.forName("反射.Animal").getConstructor()//无参
Animal animal = (Anlimal) constructor.newInstance()//无参
Constructor constructor = Class.forName("反射.Animal").getConstructor(int.class,String.class)//有参
Animal animal = (Anlimal) constructor.newInstance(1,"name")//有参
三,Field
Field类表示代表类中的一个成员变量,并提供动态访问权限
Class claa1 = Class.forName("反射.Animal")
Animal animal = (Animal) class1.getConstructor().newInstance()
1,Field 对象获取getField(),getFields()
Field field = class1.getField("name")//获取指定public属性
Field[] field = class1.getFields();//获取所有public属性
2,Field 对象获取getDeclaredField(),getDeclaredFields()
Field field = class1.getDeclaredField()//获取指定属性
Field[] field = class1.getDeclaredFields()//获取所有属性
3,设置变量是否可访问(一般私有属性需要)
field.setAccessible(boolean)
4,变量读取设置
field.set(animal,1)
Object = obj = field.get(animal)
四,method
Method代表类中的成员方法
Class claa1 = Class.forName("反射.Animal")
Animal animal = (Animal) class1.getConstructor().newInstance()
1,获取所有方法
Method [] method = class1.getMethods()//获所有public方法
Method [] method = class1.DeclaredgetMethods()//获取所有方法,但不能继承方法
2,获取指定方法
Method method = class.getMethod("drink")//无参public方法
Method method = class.getMethod("drink",int.class,String.class)//无参public方法
Method method = class.DeclaredgetMethod("fly")//无参方法
Method method = class1.DeclaredgetMethods("fly",int.class,String.class)
3,通过反射执行方法
method.setAccessible(boolean)//设置变量是否可访问(一般私有方法需要)
method.invoke(animal)//无参
Objiect obj = method.invoke(animal,1,"monkey")//有参有返回值
method.invoke(animal,1,"monkey")///有参有无返回值
*/
Class
public void classdemo1() throws Exception{
//类名.class
Class class1 = Animal.class;
//对象.getClass()
Animal animal = new Animal();
Class class2 = animal.getClass();
// Class.forName("包名.类名"),会有异常,抛出
Class class3 = Class.forName("反射.Animal");
}
Constructor
//获取无参构造方法
public void constructordemo() throws Exception{
//获取类的字节码文件对应的对象
Class class1 = Class.forName("反射.Animal");
Constructor c = class1.getConstructor();
Animal animal = (Animal) c.newInstance();//相当于Animal animal = nwe Animal();
//可调用Animal中的共有方法,私有不行
animal.dringk();
}
//获取有参构造
public void constructordemo1() throws Exception{
//获取类
Class class1 = Class.forName("反射.Animal");
//获取Constructor
Constructor c = class1.getConstructor(int.class,String.class);
//获取所有构造方法
// Constructor [] constructors = class1.getConstructors();
//实例化
Animal animal = (Animal) c.newInstance(1,"monkey");//相当于Animal animal = nwe Animal(1,"monkey");
System.out.println(animal.toString());
}
Field
//获取共有属性
public void fielddemo() throws Exception{
//获取Class
Class class1 = Class.forName("反射.Animal");
//获取共有属性name
Field field = class1.getField("name");
//操作属性
Animal animal = (Animal)class1.getConstructor().newInstance();//实例化
field.set(animal,"tiger");//
//获取值
Object obj = field.get(animal);
System.out.println(obj);
System.out.println(animal);//自动调用tosring方法等同于animal.toString
}
//获取私有属性
public void fielddome1()throws Exception{
//获取Class
Class class1 = Class.forName("反射.Animal");
//获取私有属性id,getDeclaredField获取所有属性共有和私有
Field field = class1.getDeclaredField("id");
//操作属性
Animal animal = (Animal)class1.getConstructor().newInstance();//实例化
//私有属性,需要设置一个可访问权限
field.setAccessible(true);
field.set(animal,1);//
//获取值
Object obj = field.get(animal);
System.out.println(obj);
System.out.println(animal);//自动调用tosring方法等同于animal.toString
}
Method
//获取共有方法
public void methoddemo() throws Exception{
//class
Class class1 = Class.forName("反射.Animal");
//method
Method method = class1.getMethod("dringk");
//实例化
Animal animal = (Animal) class1.getConstructor().newInstance();
//执行method
method.invoke(animal);//相当于animal.dringk
}
//获取私有方法
public void methoddome1() throws Exception{
Class class1 = Class.forName("反射.Animal");
Method method = class1.getDeclaredMethod("frink");
Animal animal = (Animal) class1.getConstructor().newInstance();
//设置访问权限
method.setAccessible(true);
//执行method
method.invoke(animal);
}
//获取带参的使用方法
public void methoddome2() throws Exception{
Class class1 = Class.forName("反射.Animal");
Method method = class1.getDeclaredMethod("frink",int.class,String.class);
Animal animal = (Animal) class1.getConstructor().newInstance();
//设置访问权限
method.setAccessible(true);
//执行method
//Object obj = method.invoke(animal,1,"boys");//方法有返回值情况
//System.out.println(obj);
method.invoke(animal,1,"boys");
System.out.println(animal);
}
Animal.java
public class Animal {
private int id;
public String name;
public Animal(){
super();
}
public Animal(int id,String name){
this.id = id;
this.name=name;
}
public void setName(String name) {
this.name = name;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public int getId() {
return id;
}
public void dringk(){
System.out.println("共有方法");
}
private void frink(){
System.out.println("私有方法");
}
private void frink(int id,String name){
this.id = id;
this.name = name;
System.out.println("id="+id+",name="+name);
}
@Override
public String toString() {
return "Animal{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
Text.java
public class Test {
public void classdemo1() throws Exception{
//类名.class
Class class1 = Animal.class;
//对象.getClass()
Animal animal = new Animal();
Class class2 = animal.getClass();
// Class.forName("包名.类名"),会有异常,抛出
Class class3 = Class.forName("反射.Animal");
}//获取无参构造方法
public void constructordemo() throws Exception{
//获取类的字节码文件对应的对象
Class class1 = Class.forName("反射.Animal");
Constructor c = class1.getConstructor();
Animal animal = (Animal) c.newInstance();//相当于Animal animal = nwe Animal();
//可调用Animal中的共有方法,私有不行
animal.dringk();
}
//获取有参构造
public void constructordemo1() throws Exception{
//获取类
Class class1 = Class.forName("反射.Animal");
//获取Constructor
Constructor c = class1.getConstructor(int.class,String.class);
//获取所有构造方法
// Constructor [] constructors = class1.getConstructors();
//实例化
Animal animal = (Animal) c.newInstance(1,"monkey");//相当于Animal animal = nwe Animal(1,"monkey");
System.out.println(animal.toString());
}
//获取共有属性
public void fielddemo() throws Exception{
//获取Class
Class class1 = Class.forName("反射.Animal");
//获取共有属性name
Field field = class1.getField("name");
//操作属性
Animal animal = (Animal)class1.getConstructor().newInstance();//实例化
field.set(animal,"tiger");//
//获取值
Object obj = field.get(animal);
System.out.println(obj);
System.out.println(animal);//自动调用tosring方法等同于animal.toString
}
//获取私有属性
public void fielddome1()throws Exception{
//获取Class
Class class1 = Class.forName("反射.Animal");
//获取私有属性id,getDeclaredField获取所有属性共有和私有
Field field = class1.getDeclaredField("id");
// Field[] field1 = class1.getDeclaredFields();
//操作属性
Animal animal = (Animal)class1.getConstructor().newInstance();//实例化
//私有属性,需要设置一个可访问权限
field.setAccessible(true);
field.set(animal,1);//
//获取值
Object obj = field.get(animal);
System.out.println(obj);
System.out.println(animal);//自动调用tosring方法等同于animal.toString
}
//获取共有方法
public void methoddemo() throws Exception{
//class
Class class1 = Class.forName("反射.Animal");
//method
Method method = class1.getMethod("dringk");
//实例化
Animal animal = (Animal) class1.getConstructor().newInstance();
//执行method
method.invoke(animal);//相当于animal.dringk
}
//获取私有方法
public void methoddome1() throws Exception{
Class class1 = Class.forName("反射.Animal");
Method method = class1.getDeclaredMethod("frink");
Animal animal = (Animal) class1.getConstructor().newInstance();
//设置访问权限
method.setAccessible(true);
//执行method
method.invoke(animal);
}
//获取带参的使用方法
public void methoddome2() throws Exception{
Class class1 = Class.forName("反射.Animal");
Method method = class1.getDeclaredMethod("frink",int.class,String.class);
Animal animal = (Animal) class1.getConstructor().newInstance();
//设置访问权限
method.setAccessible(true);
//执行method
//Object obj = method.invoke(animal,1,"boys");//方法有返回值情况
//System.out.println(obj);
method.invoke(animal,1,"boys");
System.out.println(animal);
}
public static void main(String[] args) throws Exception {
Test test = new Test();
// test.constructordemo();
// test.constructordemo1();
// test.fielddemo();
// test.fielddome1();
// test.methoddemo();
// test.methoddome1();
// test.methoddome2();
}
}