Java反射

2021-02-01 13:14

阅读:595

标签:code   add   lan   反射   col   rgs   对象   declare   port   

Java反射

  定义:程序运行状态中,对于任一个类,都能够获取该类的所有属性和方法;对于任一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。

Demo

 

package bean;

public class User {
    private String private_name;
    int default_age;
    protected String protected_address;
    public String public_sex;

    public User() {
    }

    public User(String name, int age, String address, String sex) {
        this.private_name = name;
        this.default_age = age;
        this.protected_address = address;
        this.public_sex = sex;
    }

    private void private_method(String msg){
        System.out.println("private_method"+msg);
    }

    void default_method(){
        System.out.println("default_method");
    }

    protected void protected_method(){
        System.out.println("protected_method");
    }

    public void public_method(){
        System.out.println("public_method");
    }


    @Override
    public String toString() {
        return "User{" +
                "private_name=‘" + private_name + ‘\‘‘ +
                ", default_age=" + default_age +
                ", protected_address=‘" + protected_address + ‘\‘‘ +
                ", public_sex=‘" + public_sex + ‘\‘‘ +
                ‘}‘;
    }
}

 

 

import bean.User;

import java.lang.reflect.*;

public class Test {
    public static void main(String[] args) {
        Class> clazz = null;

        try {
            System.out.println("########### Class 相关 ##############");
            clazz = Class.forName("bean.User");   // 获取Class对象方式一
            // clazz = User.class;                  // 获取Class对象方式二
            // User user = new User();
            // clazz = user.getClass();              // 获取Class对象方式三(Object类提供的getClass())

            System.out.println(clazz.getClassLoader());  // 获取其类加载器
            System.out.println(clazz.getName());         // 获取类的全限定名
            System.out.println(clazz.getPackage());      // 获取类的包名
            System.out.println(clazz.getSimpleName());   // 获取类的简单名
            System.out.println(clazz.getSuperclass());   // 获取类的父类的全限定名

            Object obj = clazz.newInstance();    // 利用无参构造器实例化
            System.out.println(obj);

            System.out.println("########### Constructor 相关 ##############");
            Constructor> constructor = clazz.getConstructor(String.class,int.class,String.class,String.class);  // 获取指定参数类型的构造器
            Object obj1 = constructor.newInstance("jzx",25,"Nanjing","M"); // 利用有参构造器实例化
            System.out.println(obj1);

            System.out.println("########### Field 相关 ##############");
            Field field1 = clazz.getField("public_sex");  // 获取指定的public属性对象
            //Field field1 = clazz.getDeclaredField("private_name");  // 获取指定的属性对象
            User user1 = new User();
            //field1.setAccessible(true); // 忽略修饰符(暴力反射),不然get不能访问private修饰的private_name属性
            // Method/Constructor也有setAccessible方法
            Object obj2 = field1.get(user1);  // 获取该属性的值给所属对象
            System.out.println(obj2);
            field1.set(user1,"F");            // 设置所属对象该属性的值
            System.out.println(user1);

            //Field[] field2 = clazz.getFields();   // 获取类中所有public修饰的属性
            Field[] field2 = clazz.getDeclaredFields();  // 获取类中所有的属性

            for(Field f : field2){
                System.out.println(f.getName());   // 获取属性变量名
                System.out.println(f.getModifiers()); // 获取访问权限修饰符的int值
                System.out.println(Modifier.toString(f.getModifiers())); // 将int值转换为访问权限修饰符,default是没有修饰符的
                Class type = f.getType();      // 获取属性类型的class对象
                System.out.println(type.getName());
            }

            System.out.println("########### Method 相关 ##############");
            Method method = clazz.getMethod("public_method"); // 获取指定名称,指定参数类型(无参则不写)的public方法
            //Method method = clazz.getDeclaredMethod("private_method", String.class); // 获取指定名称,指定参数类型的方法

            User user2 = new User();
            method.invoke(user2);    // 调用所属对象的该方法,对象名,参数类型(无参则不写)

            Method[] methods = clazz.getMethods();  // 获取所有public方法
            //Method[] methods = clazz.getMethods();  // 获取所有方法

        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

    }
}

 

Java反射

标签:code   add   lan   反射   col   rgs   对象   declare   port   

原文地址:https://www.cnblogs.com/jiazhongxin/p/12813830.html


评论


亲,登录后才可以留言!