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的时候用反射机制。