Java 反射(简单捋一下)
有Student类,Person类,还有一个叫Class的类,这是反射的源头。
正常方式:通过完整的类名 > 通过new实例化 > 取得实例化对象
反射方式:实例化对象 > getClass()方法 > 通过完整的类名
需要使用反射就要获得Class这个类,有三种方法:
package cn.classes; public class OneClass { }
import cn.classes.OneClass; public class Test { public static void main(String[] args) { Class<?> c1 = null; Class<?> c2 = null; Class<?> c3 = null; try{ // 方法一:forName c1 = Class.forName("cn.classes.OneClass"); } catch (ClassNotFoundException e){ e.printStackTrace(); } // 方法二 c2 = new OneClass().getClass(); // 方法三 c3 = OneClass.class; System.out.println(c1.getName()); System.out.println(c2.getName()); System.out.println(c3.getName()); } } 输出结果:cn.classes.OneClass
利用Class这个类实例化类
无参构造
package cn.classes; public class Person { private String name; private int age; // 省略getter setter @Override public String toString(){ return "Person [name=" + name + ", age=" + age + "]"; } } package cn.test; import cn.classes.Person; public class Test{ // 这样做必须在类中有一个空构造方法 public static void main(String[] args){ Class<?> c = null; try{ c = Class.forName("cn.classes.Person"); Person p = (Person)c.newInstance(); p.setName("xy"); p.setAge(20); System.out.println(p); } catch (Exception e){ e.printStackTrace(); } } }
有参构造
package cn.classes; public class Person{ private String name; private int age; public Person(Stringname,int age){ this.name = name; this.age = age; } // 省略getter setter @Override public String toString(){ return "Person [name=" + name + ", age=" + age + "]"; } } package cn.test; import java.lang.reflect.Constructor; import cn.classes.Person; public class Test{ // 若没有一个空构造方法 public static void main(String[] args) { Class<?> c = null; try { c = Class.forName("cn.classes.Person"); Constructor<?> con = c.getConstructors(String.class,int.class); Person p = (Person)con.newInstance("xy",20); System.out.println(p); } catch (Exception e){ e.printStackTrace(); } } }
Class类调用方法
demo1:
package cn.classes; public class Person{ public void add(){ System.out.println("add"); } public void addWithParameters(String name, int age){ System.out.println("add带参数方法" + name + age); } } package cn.test; import java.lang.reflect.Method; public class Test{ public static void main(String[] args){ Class<?> c1 = null; try{ c1 = Class.forName("cn.classes.Person"); // 不带参数的方法调用 Method m = c1.getMethod("add"); m.invoke(c1.newInstance()); // 带参数方法调用 Method m1 = c1.getMethod("addWithParameters", String.class, int.class); m1.invoke(c1.newInstance(), "xy", 22); } catch (Exception e){ e.printStackTrace(); } } }
demo2:
package cn.classes; public class Person{ private String name; private int age; // 省略getter setter } package cn.test; import java.lang.reflect.Method; public class Test{ public static void main(String[] args){ Class<?> c1 = null; Object obj = null; try{ c1 = Class.forName("cn.classes.Person"); obj = c1.newInstance(); setter(obj, "name", "xy", String.class); setter(obj, "age", 20, int.class); getter(obj, "name"); getter(obj, "age"); } catch (Exception e){ e.printStackTrace(); } } /** * @param obj:要操作的对象 * @param att:要操作的属性 * @param value:要设置的属性内容 * @param type:要设置的属性类型 */ public static void setter(Object obj, String att, Object value, Class<?> type){ try{ // 得到setter方法 Method m = obj.getClass().getMethod("set" + initStr(att), type); m.invoke(obj, value); } catch (Exception e){ e.printStackTrace(); } } /** * @param obj:要操作的对象 * @param att:要操作的属性 */ public static void getter(Object obj, String att){ try{ // 得到getter方法 Method m = obj.getClass().getMethod("get" + initStr(att)); System.out.println(m.invoke(obj)); } catch (Exception e){ e.printStackTrace(); } } /** * 首字母大写 * @param oldStr * @return */ public static String initStr(String oldStr) { String newStr = oldStr.substring(0, 1).toUpperCase() + oldStr.substring(1); return newStr; } }