栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java反射基础知识

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java反射基础知识

Person类
package com.study.reflex;

public class Person extends Father implements StudyInterface {

    private String username;
    private String password;
    public String a;
    protected String b;
    String c;
    private String d;
    private Integer age;
    private int money;

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

    public void eat(String food) {
        System.out.println("eat..." + food);
    }

    private void sport() {
        System.out.println("sport...");
    }

    public Person() {

    }

    public Person(String username, Integer age) {
        this.username = username;
        this.age = age;
    }

    public Person(String username, int money) {
        this.username = username;
        this.money = money;
    }

    public Integer getAge() {
        return age;
    }

    public int getMoney() {
        return money;
    }

    public String getUsername() {
        return username;
    }

    public String getPassword() {
        return password;
    }

    public String getA() {
        return a;
    }

    public String getB() {
        return b;
    }

    public String getC() {
        return c;
    }

    public String getD() {
        return d;
    }

    @Override
    public void IStudy() {
        System.out.println("IStudy...");
    }

    @Override
    public String toString() {
        return "Person{" +
                "username='" + username + ''' +
                ", password='" + password + ''' +
                ", a='" + a + ''' +
                ", b='" + b + ''' +
                ", age=" + age +
                ", money=" + money +
                '}';
    }
}
Father类
package com.study.reflex;

public class Father {
    private String fatherUsername;
    private String fatherPassword;

    public String getFatherUsername() {
        return fatherUsername;
    }

    public String getFatherPassword() {
        return fatherPassword;
    }

    @Override
    public String toString() {
        return "Father{" +
                "fatherUsername='" + fatherUsername + ''' +
                ", fatherPassword='" + fatherPassword + ''' +
                '}';
    }
}
StudyInterface接口
package com.study.reflex;

public interface StudyInterface {
    public void IStudy();
}

获取字节码的三种方式
  1. Class.forName(“全类名”)
  2. 类名.class
  3. 对象.getClass()

并且通过这三种方式获得的字节码对象是相同的。

代码:

package com.study.reflex;

public class Test {
    public static void main(String[] args) throws Exception {
    
        Class class1 = Class.forName("com.study.reflex.Person");
        
        Class class2 = Person.class;
        
        Person person = new Person();
        Class class3 = person.getClass();

		// true
        System.out.println(class1 == class2);
        // true
        System.out.println(class1 == class3);
    }
}

2 成员变量Field

获取成员变量的目的主要有两个:
1.获取值
2.设置值

2.1 获取所有public修饰符的成员变量
package com.study.reflex;

import java.lang.reflect.Field;

public class Test {
    public static void main(String[] args) throws Exception {
        Class personClass = Person.class;
        // 获取所有public修饰符的成员变量
        Field[] fields = personClass.getFields();
        for (Field field : fields) {
            System.out.println(field);
        }
        // 获取指定名称的public修饰符成员变量
        Field a = personClass.getField("a");
        // 设置值
        Person person = new Person();
        a.set(person, "123456");
        // 获取值
        Object value = a.get(person);
        System.out.println(value);
    }
}

结果

2.2 获取所有修饰符的成员变量
package com.study.reflex;

import java.lang.reflect.Field;

public class Test {
    public static void main(String[] args) throws Exception {
        Class personClass = Person.class;
        // 获取所有成员变量
        Field[] declaredFields = personClass.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            System.out.println(declaredField);
        }
        // 获取指定名称的成员变量
        Field username = personClass.getDeclaredField("username");
        Field money = personClass.getDeclaredField("money");
        // 对私有成员变量进行设置值、获取值之前,需要设置,称为暴力反射
        money.setAccessible(true);
        username.setAccessible(true);
        // 设置值
        Person person = new Person();
        username.set(person, "admin");
        money.setInt(person, 10000);
        // 获取值
        Object value = username.get(person);
        System.out.println(value);
        System.out.println(person);
    }
}

结果

3 构造方法Constructor

代码

package com.study.reflex;

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

public class Test {
    public static void main(String[] args) throws Exception {
        Class personClass = Person.class;
        // 获取有参构造器
        Constructor constructor = personClass.getConstructor(String.class, int.class);
        Constructor constructor1 = personClass.getConstructor(String.class, Integer.class);
        // 通过有参构造器创建对象
        Object o = constructor.newInstance("123456", 99);
        System.out.println(o);
        Object o1 = constructor1.newInstance("654321", 66);
        System.out.println(o1);

        // 获取无参构造器
        Constructor constructor2 = personClass.getConstructor();
        // 通过无参构造器创建对象
        Object o2 = constructor2.newInstance();
        System.out.println(o2);

        // 也可以通过该方法直接创建无参构造器
        Object o3 = personClass.newInstance();
        System.out.println(o3);
    }
}

结果

4 获取成员方法 4.1 获取public成员方法,会把父类的成员方法也获取到
package com.study.reflex;

import java.lang.reflect.Method;

public class Test {
    public static void main(String[] args) throws Exception {
        Class personClass = Person.class;
        // 获取自身的public成员方法和所有父类的public方法
        Method[] methods = personClass.getMethods();
        for (Method method : methods) {
            System.out.println(method);
        }

        System.out.println("==================");

        // 获取指定名称的public成员方法,没参数
        Method eat = personClass.getMethod("eat");
        Person person = new Person();
        // 调用
        eat.invoke(person);

        System.out.println("==================");

        // 获取指定名称的public成员方法,带参数
        Method eat1 = personClass.getMethod("eat", String.class);
        eat1.invoke(person, "饭");

        System.out.println("==================");

        // 获取私有的成员方法,指定名称
        Method sport = personClass.getDeclaredMethod("sport");
        // 调用私有的成员方法,需要加上
        sport.setAccessible(true);
        sport.invoke(person);
    }
}

结果

5 其他
package com.study.reflex;


public class Test {
    public static void main(String[] args) throws Exception {
        Class personClass = Person.class;
        System.out.println("全类名:" + personClass.getName());
        System.out.println("父类:" + personClass.getSuperclass().getName());
        // 实现了什么接口
        Class[] interfaces = personClass.getInterfaces();
        for (Class anInterface : interfaces) {
            System.out.println(anInterface);
        }
    }
}


结果

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/657800.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号