反射的基本原理

    xiaoxiao2021-03-25  85

    反射的基本原理

    1.通过反射来获取类

    Class<User> user = User.class; Class<?> user1 = Class.forName("com.scce.test.User"); System.out.println(user);通过反射来获取类的方式总共有三种在我这里只写了两种,其效果和

    User user = new User();

    的效果是一样的。

    运行的效果是:com.scce.test.User

    其次我们来判断这两个对象是否为同一个对象

    System.out.println(user==user1); 运行的结果为:true

    则这两个对象为同一个对象

    2.通过反射来获取构造方法

    class3.getConstructor(String.class,int.class); //这个参数表示构造器的class构造器 //只能获取公共的构造器 //构造方法 //构造器中传入参数的class的构造器 //如果想要获取私有的方法 Constructor<?> a = class3.getDeclaredConstructor(String.class,int.class);这里要讲的是方法里面传入的参数要为字节码

    所以传入的参数要写成

    String.class括号里面的内容要和参数列表里面的类型要匹配

    class3为对象的字节码.getConstructor()

    3.调用所有的构造方法

    Constructor<?>[] methods = class3.getConstructors(); for(Constructor me:methods){ System.out.println(me); }4.调用私有的构造方法

    Method method3 = user.getDeclaredMethod("method3",String.class); //调用私有的方法的时候应该设置该方法的访问权限 method3.setAccessible(true); //获取当前类的对象 //Field[] fields = user.getFields(); //获取私有的方法 Field[] fields = user.getDeclaredFields(); 5.调用普通方法

    Object obj = user.newInstance();//底层的私有属性对象 //访问公共的方法 Method method1= user.getMethod("method2",String.class); //invoke是执行的意思 String a = (String) method1.invoke(obj, "123"); System.out.println(a); Method method3 = user.getDeclaredMethod("method3",String.class); //调用私有的方法的时候应该设置该方法的访问权限 method3.setAccessible(true); //获取当前类的对象 //Field[] fields = user.getFields(); //获取私有的方法 Field[] fields = user.getDeclaredFields();全部的代码: public class Demo { public static void main(String[] args) throws Exception { //反射获取类 Class<User> user = User.class; Class<?> user1 = Class.forName("com.scce.test.User"); System.out.println(user); System.out.println(user==user1); System.out.println("============="); Object obj = user.newInstance();//底层的私有属性对象 //访问公共的方法 Method method1= user.getMethod("method2",String.class); //invoke是执行的意思 String a = (String) method1.invoke(obj, "123"); System.out.println(a); Method method3 = user.getDeclaredMethod("method3",String.class); //调用私有的方法的时候应该设置该方法的访问权限 method3.setAccessible(true); //获取当前类的对象 //Field[] fields = user.getFields(); //获取私有的方法 Field[] fields = user.getDeclaredFields(); System.out.println("-----------------------------------------"); for(Field field:fields){ System.out.println(field); } Field field = user.getDeclaredField("id"); //对属性添加get和set方法 Field field1 = user.getDeclaredField("name"); field1.setAccessible(true); System.out.println("-------------------------"); System.out.println("name"+field1); Object obj1 = user.newInstance(); field1.set(obj1, "ad"); System.out.println("----------------------"); field1.get(obj1); System.out.println( field1.get(obj1)); //单例设计模式: //在整个应用程序中某一个类的对象,有且只有一个对象 //懒汉模式、枚举 } public static <T>T createInstance(String className,Class<T> cls){ try { Class<T> clz= (Class<T>)Class.forName(className); Object obj = clz.newInstance(); return (T) obj; } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } }

    转载请注明原文地址: https://ju.6miu.com/read-13928.html

    最新回复(0)