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

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));
    }

你可能感兴趣的:(java中的反射机制及其一系列的操作方法)