理论点:首先我们在平时编程过程中,经常会去获得实例对象。
new一个对象,是我们常用的方法。
所以,每次我们需要一个对象实例的时候就需要提前编译,这就带有局限性。
那我们可不可以在需要用到的时候再去创建这个类呢,而且还可以只需要其中的一个方法或者一个属性。
那么,反射机制是可以做到这点的,而动态生成正是反射的最大的实用点。
我们可通过类对象的方法获取类实例,也可获取类方法、变量等。
常用方法:
1、Class类:代表一个类
2、Field类:代表类的成员变量(类的属性)
3、Method类:代表类的方法
4、Constructor类:代表类的构造方法
5、Array类:提供了动态创建数组,以及访问数组的元素的静态方法
实例创建:
类:
package moBanClass;
public class Hero {
//定义变量
public String name;
public int age;
public String sex;
//私有变量
private String money;
//共有方法
public void showName() {
System.out.println("My Name Is LinDa~");
}
//私有方法
private void showMoney() {
System.out.println("No Money!");
}
}
获取类对象:
//首先获取类对象,有4种方式
1.Class class=Hero.class;
2.Class class=Class.forName("moBanClass.Hero");
3.Class<Hero> class=new Hero().getClass();----//非经常使用,毕竟都有了对象还反射干嘛
//前三种无需获得Class类对象,但是ClassLoader则需要先获得ClassLoader对象
4.Class<Hero> class=ClassLoader.getSystemClassLoader().loadClass("moBanClass.Hero");
获取实例对象:
//获取类构造器
Constructor c= class.getConstructor();
//new一个实例
Hero hero =c.newInstance();
亦可:
Hero hero= Hero.class.getConstructor().newInstance();
也可直接获取属性变量:
但是得注意此处所用的方法:
1.Field[] getFields(null / String fieldName):获取 所有的/某一个 "公有字段"。
2.Field[] getDeclaredFields(null / String fieldName):获取 所有的/某一个字段,公共或私有皆可。
//类对象
Class<Hero> clazz=Hero.class;
//实例对象
Hero hero=clazz.getConstructor().newInstance();
//获取name属性
Field fieldName=clazz.getField("name");
fieldName.set(hero, "panda");
System.out.println(hero.name);
-------------------------------------
//hero.name=panda
//获取所有公共属性
Field[] fields=clazz.getFields();
for (Field field : fields) {
System.out.println(field);
}
-------------------------------------
//field:
public java.lang.String moBanClass.Hero.name
public int moBanClass.Hero.age
public java.lang.String moBanClass.Hero.sex
//获取所有公共或私有属性
Field[] fields2=clazz.getDeclaredFields();
for (Field field2 : fields2) {
System.out.println(field2);
}
-------------------------------------
//field:
public java.lang.String moBanClass.Hero.name
public int moBanClass.Hero.age
public java.lang.String moBanClass.Hero.sex
private java.lang.String moBanClass.Hero.money
同样,也可以利用反射获取方法,但是此处一样需要注意
1.public Method[] getMethods(String name,Class<?>... parameterTypes):获取所有"公有方法"。
2. public Method[] getDeclaredMethods(String name,Class<?>... parameterTypes):获取所有的成员方法,包括私有的(不包括继承的)。
同样也可以只获取单个方法。
//获取showName方法
Method method=clazz.getMethod("showName");
method.invoke(hero);
-------------------------------------
//My Name Is LinDa~
//获取所有公共方法
Method[] methods=clazz.getMethods();
for (Method method2 : methods) {
System.out.println(method2);
}
-------------------------------------
//public void moBanClass.Hero.showName()
//获取所有公共或私有方法
Method[] methods2=clazz.getDeclaredMethods();
for ( Method method2 : methods2) {
System.out.println(method2);
}
//public void moBanClass.Hero.showName()
//private void moBanClass.Hero.showMoney()
以上就是反射常用的一些方法,具体的要用的方法可去API查询~增强理解~

本文深入解析Java反射机制,介绍如何动态获取类实例、属性及方法,演示反射在实例创建、属性操作和方法调用的应用,并对比公有和私有成员的获取差异。
379

被折叠的 条评论
为什么被折叠?



