第一步:创建要反射的类的字节码文件对象,其实就是创建了Class类的对象(一共有三种方法)
方式一:通过对对象获取字节码文件对象
例如:Person p = new Person();
Class c1 = p.getclass(); //Object类中的方法:public final Class<?> getClass()返回此 Object
的运行时类。
方式二:任意数据类型都具备一个class静态属性.
Class c2 = Person.class;
方式三:调用Class类中的静态方法forName()方法
Class c3 = class.forName("包名+类名");
第二步:获取类中的属性和方法的对象,要谁反射谁的对象.
例如:看看构造方法有哪些,挑一个来用用.看看Class类给我们提供了哪些方法?
public Constructor<?>[] getConstructors()throws SecurityException
返回一个包含某些 Constructor
对象的数组,这些对象反映此 Class
对象所表示的类的所有公共构造方法。
就是获取该字节码文件对象的所有公共的构造方法
public Constructor<T> getConstructor(Class<?>... parameterTypes)throws NoSuchMethodException,SecurityException
返回一个 Constructor
对象,它反映此 Class
对象所表示的类的指定公共构造方法。parameterTypes
参数是 Class
对象的一个数组
其实就是构造方法对象,通过该对象可以访问Constructor
类中的方法
第三步:通过Constructor类中的newInstance()方法创建我们要反射的类的对象.
package lianxi1; public class Yordles { public String name; public int age; public String sex; public Yordles() { super(); } public Yordles(String name) { super(); this.name = name; } public Yordles(String name, int age, String sex) { super(); this.name = name; this.age = age; this.sex = sex; } @Override public String toString() { return "Yordles [name=" + name + ", age=" + age + ", sex=" + sex + "]"; } }
package lianxi1; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; public class Demo1 { public static void main(String[] args) throws InstantiationException, IllegalAccessException, Exception { //创建Yordles类的字节码文件对象 Class<Yordles> yd = Yordles.class; //调用Class类的方法,获取Yordles类构造方法对象的数组 Constructor[] constructors = yd.getConstructors(); //遍历数组 for (Constructor constructor : constructors) { //看看Yordles类中都有哪些构造方法 System.out.println(constructor); /* 打印结果为:publiclianxi1.Yordles(java.lang.String,int,java.lang.String) public lianxi1.Yordles(java.lang.String) public lianxi1.Yordles() */ } //parameterTypes表示成员变量的类型,这里获取一个参的构造方法对象 Constructor<Yordles> c = yd.getConstructor(String.class); //创建Yordles类对象,并赋值一个名字 Yordles yordle = c.newInstance("迅捷斥候"); //打印结果为:Yordles [name=迅捷斥候, age=0, sex=null] System.out.println(yordle); } }
如果要反射普通方法
public Method[] getMethods() throws SecurityException 获取所有公共的方法,包括继承的方法
public Method[] getDeclaredMethods() throws SecurityException 获取所有声明的方法
public Method getDeclaredMethod(String name,Class<?>... parameterTypes)
throws NoSuchMethodException,SecurityException
name:方法名称 parameterTypes:参数的类型
Method:
public Object invoke(Object obj, Object... args) 执行方法
throws IllegalAccessException,
IllegalArgumentException,
InvocationTargetException
obj:我要执行哪个对象的方法 args:方法的参数
如果要反射成员属性
public Field getField(String name) 获取某个公共属性
throws NoSuchFieldException,
SecurityException
public Field getDeclaredField(String name) 获取某个声明属性
throws NoSuchFieldException,
SecurityException
Field:字段类
public void set(Object obj, Object value) 为指定对象的指定字段赋值
throws IllegalArgumentException,
IllegalAccessException
obj:要赋值字段的对象 value:赋成的新值