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

Java反射机制

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

Java反射机制

  • 将类的各个组成部分封装为其他对象,这就是反射.

  • 好处:
    • 可以在程序运行中操作这些对象(idea中的方法提示,就是反射的应用)
    • 可以解耦提高程序的课扩展性
  • 获取class类对象的方式
  1. 在源代码阶段:Class.forName("全类名"):将字节码加载进内存,返回Class对象. 静态方法
  2. 在类对象阶段:类名.class方式获取
  3. 在运行阶段: 对象.getClass()   该方法封装在object里,所有对象都有.
  • 同一个字节码文件在一次程序运行的过程中,只会被加载一次,无论通过哪一重方式获取的class文件获取的对象都是同一个.
  • 方法1 经常用于配置文件中,读取文件,加载类, 方式2将常用于参数的传递,方式3多用于获取对象的字节码
class对象的功能:

1.获取功能 不带Declared的方法只能获取公共的对象,带declared的可以获取所有对象

        获取成员变量 

        获取构造方法 

        获取成员方法

        获取类名 

2.对于成员变量:

        1.获取值 get()

        2.设置值 set()

3.getField实例

get方法需要传入一个对象参数

Class personClass = Person.class;
Field a = personClass.getField("a");
Person person = new Person();
Object value = a.get(person);
System.out.println(value);

4.在使用getDeclaredField方法获取到变量之后,若要访问私有变量,则要使用暴力反射,即加上setAcessible=true

Class personClass = Person.class;
Field age = personClass.getDeclaredField("age");
age.setAccessible(true);
Object o = age.get(person);
System.out.println(o);

5.获得构造器:1.用来创建对象 newInstance()

                       2.如果使用空参数构造方法创建对象,可以使用class对象的newInstance方法

6.获取成员方法

        参数包括函数名,参数列表两个.

        Object.invoke();

        获取方法名:getName()

案例

​​​​​​​

 配置文件如下

className=com.sdu.domain.Person
methodName = eat

 Person类如下

public class Person {
    private String name;
    private int age;
    public int a ;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + ''' +
                ", age=" + age +
                ", a=" + a +
                '}';
    }
    public void eat(){
        System.out.println("eat!!!");
    }
    public void eat(String food){
        System.out.println("eat!!!" + food);
    }
}

测试代码如下

public class RefTest {
    public static void main(String[] args) throws Exception {
        Properties pro = new Properties();//加载配置文件
        ClassLoader classLoader = RefTest.class.getClassLoader();
        InputStream is = classLoader.getResourceAsStream("pro.properties");
        //找到当前路径下的文件
        pro.load(is);

        //获取配置文件中定义的数据
        String className = pro.getProperty("className");
        String methodName = pro.getProperty("methodName");

        //反射加载该类
        Class aClass = Class.forName(className);
        Object obj = aClass.newInstance();
        Method method = aClass.getMethod(methodName);
        method.invoke(obj);
    }
}

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

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

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