2021/10/09 第一天日记-java 反射(60%)

1.获取Class对象的三种方式

 //获取Class对象的三种方式
        //1.通过实例对象获取
        User user = new User();
        Class aClass1 = user.getClass();
        System.out.println(aClass1);
        //2.直接获取class2
        Class<User> aClass2 = User.class;
        System.out.println(aClass2);
        //3.通过路径加载类获取
        Class<?> aClass3 = Class.forName("com.dxy.study_0628.domain.User");
        System.out.println(aClass3);

2.获取所有公有构造方法

  //4.获取所有公有构造方法
        System.out.println("---获取所有公有构造方法---");
        Constructor<?>[] constructors = aClass3.getConstructors();
        for (Constructor constructor:constructors){
    
    
            System.out.println(constructor);
        }
package com.dxy.study_0628.study.reflect;


import com.dxy.study_0628.domain.User;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * 关于反射的使用
 */
public class fs_02 {
    
    

    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {
    
    
        //获取Class对象的三种方式
        //1.通过实例对象获取
        User user = new User();
        Class aClass1 = user.getClass();
        System.out.println(aClass1);
        //2.直接获取class2
        Class<User> aClass2 = User.class;
        System.out.println(aClass2);
        //3.通过路径加载类获取
        Class<?> aClass3 = Class.forName("com.dxy.study_0628.domain.User");
        System.out.println(aClass3);
      //4.获取所有公有构造方法
        System.out.println("---获取所有公有构造方法---");
        Constructor<?>[] constructors = aClass3.getConstructors();
        for (Constructor constructor:constructors){
    
    
            System.out.println(constructor);
        }
        //5.所有的构造方法(包括:私有、受保护、默认、公有)
        System.out.println("************所有的构造方法(包括:私有、受保护、默认、公有)***************");
        Constructor<?>[] declaredConstructors = aClass3.getDeclaredConstructors();
        for (Constructor constructor:declaredConstructors){
    
    
            System.out.println(constructor);
        }
        //6.获取公有、无参的构造方法
        System.out.println("*****************获取公有、无参的构造方法*******************************");
        Constructor<?> constructor = aClass3.getConstructor(null);
        System.out.println(constructor);
        //实例对象
        Object o = constructor.newInstance();
        System.out.println(o);
        //7.获取私有构造方法,并调用
        System.out.println("******************获取私有构造方法,并调用*******************************");
        Constructor<?> declaredConstructor = aClass3.getDeclaredConstructor(String.class);
        System.out.println(declaredConstructor);
        //调用构造方法
        declaredConstructor.setAccessible(true);//暴力访问(忽略掉访问修饰符)
        Object o1 = declaredConstructor.newInstance("123");
        System.out.println(o1);

        Constructor<?> declaredConstructor1 = aClass3.getDeclaredConstructor(String.class, String.class);
        System.out.println(declaredConstructor1);
        declaredConstructor1.setAccessible(true);
        Object abc = declaredConstructor1.newInstance("abc", "123");
        System.out.println(abc);
        //8.获取所有公有的字段
        System.out.println("************获取所有公有的字段********************");
        Field[] fields = aClass3.getFields();
        for (Field field:fields){
    
    
            System.out.println(field);
        }
        System.out.println("************获取所有的字段(包括私有、受保护、默认的)********************");
        Field[] declaredFields = aClass3.getDeclaredFields();
        for (Field field:declaredFields){
    
    
            System.out.println(field);
        }
        System.out.println("*************获取公有字段**并调用***********************************");
        Field gy = aClass3.getField("gy");
        System.out.println(gy);

        Object o2 = aClass3.getConstructor().newInstance();
        gy.set(o2,"gonygou43");
        System.out.println(o2);
        //9.获取私有字段****并调用
        System.out.println("**************获取私有字段****并调用********************************");
        Field id = aClass3.getDeclaredField("id");
        id.setAccessible(true);//暴力反射,解除私有限定
        Object o3 = aClass3.getConstructor().newInstance();
        id.set(o3,5);
        Field username = aClass3.getDeclaredField("username");
        username.setAccessible(true);//暴力反射,解除私有限定
        username.set(o3,"tov");
        System.out.println(o3);
        //10.获取所有公有方法
        System.out.println("***************获取所有的”公有“方法*******************");
        Method[] methods = aClass3.getMethods();
        for (Method method:methods){
    
    
            //包括了所有的公有方法
            System.out.println(method);
        }
        //11.获取所有的方法,包括私有的
        System.out.println("***************获取所有的方法,包括私有的*******************");
        Method[] declaredMethods = aClass3.getDeclaredMethods();
        for (Method method:declaredMethods){
    
    
            System.out.println(method);
        }
        System.out.println("***************获取公有的setPassword()方法*******************");
        Method getPassword = aClass3.getMethod("setPassword", String.class);
        System.out.println(getPassword);
        Object o4 = aClass3.getConstructor().newInstance();
        getPassword.invoke(o4,"刘德华");
        System.out.println(o4);
        System.out.println("***************获取私有的show()方法******************");
        Method show = aClass3.getDeclaredMethod("show", String.class);
        System.out.println(show);
        show.setAccessible(true);//解除私有限定
        Object invoke = show.invoke(o4, "555");
        System.out.println(o4+"---"+invoke);
    }
}

调用main方法

package com.dxy.study_0628.study.reflect;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * 通过反射调用main方法
 */
public class fs_03 {
    
    
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
    
    
        //1、获取Student对象的字节码
        Class clazz = Class.forName("com.dxy.study_0628.study.reflect.fs_02");
        Method main = clazz.getMethod("main", String[].class);
       // main.invoke(null, new Object[]{new String[]{"a","b","c"}});
        main.invoke(null,(Object)new String[]{
    
    "a","b","c"});
    }
}

https://blog.csdn.net/sinat_38259539/article/details/71799078

猜你喜欢

转载自blog.csdn.net/qq_40711092/article/details/120678817
今日推荐