第一步:创建要反射的类的字节码文件对象,其实就是创建了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 + "]"; } } View Code 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); } } View Code
如果要反射普通方法
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:赋成的新值
转载于:https://www.cnblogs.com/Riven/p/4639058.html
