参考:https://mp.weixin.qq.com/s/GDuqMY7TSicjHpZ4wDz2dA
获取Class对象的几种方式
public class MainTest { public static void main(String[] args) { Student stu1=new Student(); Class stuClass=stu1.getClass(); System.out.println(stuClass.getName()); Class stuClass2=Student.class; System.out.println(stuClass==stuClass2); try { Class stuClass3=Class.forName("com.ref.test.Student"); 一般情况下这种方式用的最常见 System.out.println(stuClass2==stuClass3); } catch (Exception e) { e.printStackTrace(); } } }
参考:https://www.cnblogs.com/rocomp/p/4781987.html
反射获取构造函数并使用
//1.加载Class对象 Class clazz = Class.forName("com.ref.test.Student"); System.out.println("所有公有构造方法"); java.lang.reflect.Constructor[] constructors=clazz.getConstructors(); System.out.println("所有的构造方法(包括:私有、受保护、默认、公有)"); constructors=clazz.getDeclaredConstructors(); System.out.println("获取公有、无参的构造方法"); java.lang.reflect.Constructor con= clazz.getConstructor();
//获取某个公有的构造函数 java.lang.reflect.Constructor cons1=clazz.getConstructor(String.class); //获取某个构造函数 java.lang.reflect.Constructor cons2=clazz.getDeclaredConstructor(String.class,Integer.class);
反射获取字段并使用
// 1.加载Class对象 Class clazz = Class.forName("com.ref.test.Student"); Object obj = clazz.getConstructor().newInstance(); // 获取指定字段,但是只能获取公有的字段 Field field1 = clazz.getField("name"); field1.set(obj, "123"); System.out.println(obj.toString()); Field field2 = clazz.getDeclaredField("phoneNum"); // 获取指定名称的字段(在所有中查找) System.out.println(field2); 这里获取到私有字段在类外是不能进行任何操作赋值取值操作的 System.out.println("*****************"); Field[] fields = clazz.getFields(); // 这里只能取到公有的字段 for (Field field : fields) { System.out.println(field); } System.out.println("******************"); Field[] fields2 = clazz.getDeclaredFields();// 这里可以取到所有的字段 for (Field field : fields2) { System.out.println(field); }
反射获取方法并调用
// 1.加载Class对象 Class clazz = Class.forName("com.ref.test.Student"); Object obj = clazz.getConstructor().newInstance(); Method method1=clazz.getMethod("show1", String.class); method1.invoke(obj, "123"); Method method2=clazz.getDeclaredMethod("show2"); method2.invoke(obj); //获取所有的成员方法,包括私有的(不包括继承的 Method[] methods1=clazz.getDeclaredMethods(); //获取所有的公有的方法,包括继承父类的公有方法 Method[] methods2=clazz.getMethods();