1.首先獲取一個類有三種方法java
Class clazz1 = Class.forName("com.example.demo.example.reflection.Base");//包名+類名 Class clazz2 = new Base().getClass(); Class clazz3 = Base.class;
2.獲取類的所有構造方法this
Constructor<?> constructor[] = clazz1.getConstructors();//獲取全部的構造方法
constructor[i] 表示第 i 個構造方法spa
3.獲取到直接父類get
clazzExtend.getSuperclass().getName()
4.獲取本類中全部的屬性io
Field[] fields = clazz1.getDeclaredFields();//獲取本類的全部屬性 for (int i=0; i<fields.length; i++){ int mo = fields[i].getModifiers();//權限修飾符 public /private /public static String pive = Modifier.toString(mo);//屬性類型 int /String Class type = fields[i].getType(); System.out.println(pive + " " + type.getName() + " " + fields[i].getName()); }
結果是:class
public java.lang.String name
private int age權限
5.獲取父類public 屬性map
Class clazz1 = Class.forName("com.example.demo.example.reflection.ExtendBase"); Field[] fields = clazz1.getFields(); for(int i=0;i<fields.length;i++){ int mo = fields[i].getModifiers();//獲取到本類和父類public 屬性 String priv = Modifier.toString(mo); Class type = fields[i].getType(); System.out.println(priv + " " + type.getName() + " " + fields[i].getName()); //public int a 等相似的信息 }
結果是:public java.lang.String name 原本中public屬性
public int a 父類中public屬性反射
6.獲取父類的方法和本類的方法方法
Class clazz1 = Class.forName("com.example.demo.example.reflection.ExtendBase"); // Class clazz1 = Class.forName("com.example.demo.example.reflection.Base"); try { method = clazz1.getMethod("say"); String invoke = (String) method.invoke(clazz1.newInstance()); System.out.println(invoke); method = clazz1.getMethod("addAge",int.class); System.out.println(method.invoke(clazz1.newInstance(),2)); } catch (NoSuchMethodException e) { e.printStackTrace(); }
Class clazz1 = Class.forName("com.example.demo.example.reflection.ExtendBase");
// Class clazz1 = Class.forName("com.example.demo.example.reflection.Base");
try {
method = clazz1.getMethod("say");
String invoke = (String) method.invoke(new ExtendBase());
System.out.println(invoke);
method = clazz1.getMethod("addAge",int.class);
System.out.println(method.invoke(new ExtendBase(),2)); //clazz1.newInstance()至關於new ExtendBase()
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
public String addAge(int a){ return "哈哈"; }
getMethod("方法名",「參數的類型(沒有時不用寫)」);
invoke(clazz,參數);
7.經過反射操做屬性
Class clazz1 = Class.forName("com.example.demo.example.reflection.ExtendBase"); Object obj = clazz1.newInstance(); try { Field fields = clazz1.getDeclaredField("name"); fields.setAccessible(false);//爲false 不能給私有的屬性賦值。 fields.set(obj,"zhangsan"); System.out.println(fields.get(obj)); } catch (NoSuchFieldException e) { e.printStackTrace(); }
父類:
package com.example.demo.example.reflection; public class Base { private static int num = 1; public int a; static{ System.out.println("Base " + num); } public Base(){} public Base(int a){ this.a= a; } public static int getNum() { return num; } public static void setNum(int num) { Base.num = num; } public int getA() { return a; } public void setA(int a) { this.a = a; } public String say(){ return "Hello 醒醒啊"; } public int addAge(String as){ return 12; }
子類:
package com.example.demo.example.reflection; public class ExtendBase extends Base { public String name; private int age; public ExtendBase(){} public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String addAge(int a){ return "哈哈11"; } }
應用:map轉JavaBean的時候用反射機制。