一 .什么是反射?
class是一切反射的根源,JAVA反射机制是在运行状态中,对于任和一个类,通过反射都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制 |
二 .反射的作用:
通过反射访问java对象的属性,方法,构造方法等 |
三 .得到class类的对象有三种方式:
1. object类中的getClass()方法 2. 类.class 3. Class.forName("类的包名") |
四. 具体功能实现:
public class DogBean { private String dColor; private int dAge; private String dSex; private String dName; public DogBean() { } public DogBean(String dName) { this.dName = dName; } public DogBean(String dColor, int dAge, String dSex) { this.dColor = dColor; this.dAge = dAge; this.dSex = dSex; } public DogBean(String dColor, int dAge, String dSex, String dName) { this.dColor = dColor; this.dAge = dAge; this.dSex = dSex; this.dName = dName; } public String getdColor() { return dColor; } public void setdColor(String dColor) { this.dColor = dColor; } public int getdAge() { return dAge; } public void setdAge(int dAge) { this.dAge = dAge; } public String getdSex() { return dSex; } public void setdSex(String dSex) { this.dSex = dSex; } public void getDogName(String name) { System.out.print("我的名字叫 : "+dName+ "\n"); } private Integer getDogAge(Integer age) { return age; } } |
1 .获取类信息:
@Test public void TestReflex(){ DogBean dogBean = new DogBean("黑色",2,"男"); //获取改对象所在的信息 Class<? extends DogBean> cl = dogBean.getClass(); Class class2 = DogBean.class; Class class3 = null; try { class3 = Class.forName("com.example.administrator.tests.bean.DogBean"); } catch (ClassNotFoundException e) { e.printStackTrace(); } System.out.print(" 输出cl: "+cl+"\n"); System.out.print(" 输出cl: "+cl.getName()+"\n"); System.out.print(" 输出 class2 : "+class2.getName()+"\n"); System.out.print(" 输出 class3 : "+class3.getName()+"\n"); } |
输出结果:
输出cl: class com.example.administrator.tests.bean.DogBean 输出cl: com.example.administrator.tests.bean.DogBean 输出 class2 : com.example.administrator.tests.bean.DogBean 输出 class3 : com.example.administrator.tests.bean.DogBean |
2.通过类信息创建对象:
/** * 创建对象 */ DogBean class3Oblect = null; try { //调用了DogBean的无参数构造方法,创建新的实例 class3Oblect = (DogBean)class3.newInstance(); class3Oblect.setdAge(33); class3Oblect.setdSex("男"); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } System.out.print(" 输出 创建对象得到的值 年龄: "+class3Oblect.getdAge()+" 性别:"+class3Oblect.getdSex()+"\n"); |
输出结果:
输出 创建对象得到的值 年龄: 33 性别:男
五. 获取构造方法:
/** * 获取构造方法 */ Constructor[] class3Constructors = class3.getConstructors(); for (int i = 0; i < class3Constructors.length; i++) { System.out.print(" 输出所有构造方法: " + class3Constructors[i] + "\n"); System.out.print(" 输出所有构造方法name: " + class3Constructors[i].getName() + "\n"); } |
输出结果:
输出所有构造方法: public com.example.administrator.tests.bean.DogBean()
输出所有构造方法name: com.example.administrator.tests.bean.DogBean
输出所有构造方法: public com.example.administrator.tests.bean.DogBean(java.lang.String,int,java.lang.String)
输出所有构造方法name: com.example.administrator.tests.bean.DogBean
六.获取属性:
/** * 获取所有属性 */ Field[] class3Fields = class3.getDeclaredFields(); for (int i = 0; i < class3Fields.length; i++) { System.out.print(" 获取所有属性: " + class3Fields[i] + "\n"); } |
输出结果:
获取所有属性: private java.lang.String com.example.administrator.tests.bean.DogBean.dColor
获取所有属性: private int com.example.administrator.tests.bean.DogBean.dAge
获取所有属性: private java.lang.String com.example.administrator.tests.bean.DogBean.dSex
七.获取一个属性Field的值:
try { Object c = class3.newInstance(); Field class3Field = class3.getDeclaredField("dAge"); //使用反射机制可以打破封装性 一般属性用于private 申明过的属性 class3Field.setAccessible(true); class3Field.set(c,66); System.out.print(" 输出属性的值: " + class3Field.get(c) + "\n"); } catch (Exception e) { e.printStackTrace(); } |
输出结果:
八. 获取方法等也类似获取属性这样的操作:
方法关键字 | 含义 |
getDeclaredMethods()/getMethods | 获取本类所有的方法(包括私有方法)/获取所有的方法(包括父类的方法) |
getReturnType() | 获得方法的放回类型 |
getParameterTypes() | 获得方法的传入参数类型 |
getDeclaredMethod("方法名",参数类型.class,……) | 获得特定的方法 |
构造方法关键字 | |
getDeclaredConstructors() | 获取所有的构造方法 |
getDeclaredConstructor(参数类型.class,……) | 获取特定的构造方法 |
父类和父接口 | |
getSuperclass() | 获取其类的父类 |
getInterfaces() | 获取其类实现的接口 |
后续继续补充.....