欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java中的反射机制及其一系列的操作方法

程序员文章站 2022-04-11 13:06:52
1.获取反射的源头的方式1)类名.class Class cls1=String.class;2)对象.getClass() Class cls2 = “abc”.getClass();3)Class.forName(“包名.类名”) -->推荐 Class cls3=Class....

1.获取反射的源头的方式

1)类名.class Class cls1=String.class;
2)对象.getClass() Class cls2 = “abc”.getClass();
3)Class.forName(“包名.类名”) -->推荐 Class cls3=Class.forName(“java.lang.String”);

2.反射机制可以实现的部分功能

2.1查看修饰符(public、private等)

getModifiers() 返回Java语言修饰符(public等)的类或接口,编码是一个整数。

Class<String> cls=String.class;
System.out.println(cls.getModifiers());    //17
String str = Modifier.toString(cls.getModifiers());  //public final
System.out.println(str);

2.2查看类所属的包

getPackage()

//package java.lang, Java Platform API    Specification, version 1.8
System.out.println(cls.getPackage());  

2.3查看实体的名称

getName()返回的实体的名称(数组类,接口,类、原始类型或空白)
getSimpleName()返回底层类的简单的名称

System.out.println(cls.getName()); //java.lang.String
System.out.println(cls.getSimpleName()); //String

2.4反射操作构造器

注:如果是通过私有构造器来动态创建对象时,先要通过 构造器.setAccessible(true);来开放权限

getConstructor(类<?>… parameterTypes)获取某个指定的公共的构造器
getConstructors()获取所有的公共的构造器

getDeclaredConstructor(类<?>… parameterTypes)可以获取指定的构造器
getDeclaredConstructors()获取所有的构造器

public static void testConstructor(Class<User> cls) throws Exception {
        //获取某个指定的公共的构造器
        Constructor<User> con = cls.getConstructor(int.class, String.class, String.class, String.class, int.class);
        System.out.println(con);

        //所有的构造器
        Constructor[] cons = cls.getDeclaredConstructors();
        for(Constructor c:cons){
            System.out.println(c);
        }

        //1.创建对象Class类的newInstance
        User obj=cls.newInstance();
        System.out.println(obj);

        //2.constructor类提供的newInstance(Object... initargs)
        User obj2=con.newInstance(1001,"lisi","lisi123","女",18);
        System.out.println(obj2);

        //私有的,可以放开权限
        cons[1].setAccessible(true);
        User obj3 = (User) cons[1].newInstance("lisi", "1234");
        cons[1].setAccessible(false);
        System.out.println(obj3);
    }

2.5反射操作方法

注:反射获取方法的静态方法时,要将静态方法设置为public

getMethod(String name, 类<?>… parameterTypes)返回一个方法指定对象,反映了公共成员方法
getMethods()返回公共的所有方法

getDeclaredMethod(String name, 类<?>… parameterTypes)返回一个公共的指定的方法
getDeclaredMethods()返回所有方法

public static void  methodTest(Class<User> cls) throws Exception {
        //获取
        Method[] methods = cls.getDeclaredMethods();
        System.out.println(Arrays.toString(methods));

        Method method2 = cls.getMethod("setAge", int.class);
        System.out.println(method2);

        User user=cls.newInstance();

        //调用方法
        method2.invoke(user,10);
        System.out.println(user);

        //有返回值的,私有的
        Method method3 = cls.getDeclaredMethod("test", int.class);
        method3.setAccessible(true);
        System.out.println(method3.invoke(user,12));
        method3.setAccessible(false);

        //静态方法设置为public,其他包才可以使用
        //静态方法
        cls.getDeclaredMethod("testStatic").invoke(null);
    }

2.6反射操作属性

getField(String name)返回公共的属性
getFields()返回公共的所有属性

getDeclaredField(String name)返回属性
getDeclaredFields()返回所有属性

public static void fieldTest(Class<User> cls) throws Exception {
        Field field = cls.getDeclaredField("name");
        System.out.println(field);

        User user = cls.newInstance();

        field.setAccessible(true);
        field.set(user,"张三"); //设置属性值
        System.out.println(field.get(user)); //获取属性值

        System.out.println(cls.getDeclaredField("staticField").get(null));
    }

本文地址:https://blog.csdn.net/qq_41943011/article/details/107347540