Java反射机制

导读:本篇文章讲解 Java反射机制,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

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

Java反射机制

  • 好处:

    • 可以在程序运行中操作这些对象(idea中的方法提示,就是反射的应用)
    • 可以解耦提高程序的课扩展性
  • 获取class类对象的方式

  1. 在源代码阶段:Class.forName(“全类名”):将字节码加载进内存,返回Class对象. 静态方法
  2. 在类对象阶段:类名.class方式获取
  3. 在运行阶段: 对象.getClass()   该方法封装在object里,所有对象都有.
  • 同一个字节码文件在一次程序运行的过程中,只会被加载一次,无论通过哪一重方式获取的class文件获取的对象都是同一个.
  • 方法1 经常用于配置文件中,读取文件,加载类, 方式2将常用于参数的传递,方式3多用于获取对象的字节码

class对象的功能:

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

        获取成员变量 

        获取构造方法 

        获取成员方法

        获取类名Java反射机制 

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()

案例

Java反射机制​​​​​​​

 配置文件如下

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/88907.html

(0)
小半的头像小半

相关推荐

极客之家——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!