美文网首页
Java反射

Java反射

作者: 磊_5d71 | 来源:发表于2018-10-06 17:04 被阅读0次
图片.png

反射常用对象概述

  • Class
    Class类的实例表示正在运行的Java应用程序中的类和接口
  • Constructor
    关于类的单个构造方法的信息以及对它的访问权限
  • Field
    Field提供有关类或接口的单个字段的信息,以及对它的动态访问权限。(类中的属性)
  • Method
    Method提供关于类或接口上单独的方法信息。(类中的方法)


    图片.png

Class类

图片.png
package com.alan.reflect;

import com.alan.entity.Person;
import org.junit.Test;

public class ClassTest {

    @Test
    /**
     * 获得Class对象
     * 1、类名.class
     * 2、对象.getClass()
     * 3、Class.forName()
     */
    public void demo1() throws ClassNotFoundException {
        //1、类名.class
        Class<Person> class1 = Person.class;
        //2、对象.getClass()
        Person person = new Person();
        Class<? extends Person> class2 = person.getClass();
        //3、Class.forName() 通常采用这种方式获得
        Class<?> class3 = Class.forName("com.alan.entity.Person");
    }
}

Constructor类

图片.png
package com.alan.reflect;

import com.alan.entity.Person;
import org.junit.Test;

import java.lang.reflect.Constructor;

/**
 * 获得Constructor对象
 */
public class ConstructorTest {

    @Test
    /**
     * 获得无参构造
     */
    public void demo1() throws Exception {
        //获得类的字节码文件对应的对象
        Class class1 = Class.forName("com.alan.entity.Person");
        //获得无参构造方法
        Constructor constructor = class1.getConstructor();
        //通过构造器来实例化一个对象
        Person person = (Person) constructor.newInstance(); //相当于 Person person = new Person();
        person.eat();
    }

    @Test
    /**
     * 获得有参构造,并实例化
     */
    public void demo2() throws Exception{
        //获得类的字节码文件对应的对象
        Class class1 = Class.forName("com.alan.entity.Person");
        //获得有参构造
        Constructor constructor = class1.getConstructor(String.class, String.class);
        //通过带参构造器实例化对象
        Person person = (Person) constructor.newInstance("alan", "male");//相当于 Person person = new Person("alan","male");
        System.out.println(person);
    }
}

Field类

图片.png
package com.alan.reflect;

import com.alan.entity.Person;
import org.junit.Test;

import java.lang.reflect.Field;

public class FiledTest {

    @Test
    /**
     * 测试公有属性,一般没有必要反射,直接可以通过对象获取
     */
    public void demo() throws Exception {

        //获得类字节码文件对应的对象
        Class<?> class1 = Class.forName("com.alan.entity.Person");
        //获得属性值
        Field name = class1.getField("name");
        //操作属性,JDK9以后建议使用新方法class1.getDeclaredConstructor().newInstance()
        Person person = (Person) class1.getDeclaredConstructor().newInstance();
        name.set(person,"你好啊");  //相当于 person.name = "你好啊"
        System.out.println(name.get(person));

    }


    @Test
    /**
     * 测试私有属性
     */
    public void demo2() throws Exception {
        //获得类字节码文件对应的对象
        Class class1 = Class.forName("com.alan.entity.Person");
        //获得属性值
        Field name = class1.getDeclaredField("name");
        //给私有属性赋值
        Person person = (Person) class1.getDeclaredConstructor().newInstance();
        //设置私有属性可访问权限
        name.setAccessible(true);
        name.set(person,"小二郎");
        //打印输出
        System.out.println(name.get(person));
    }
}

Method类

图片.png
package com.alan.reflect;

import com.alan.entity.Person;
import org.junit.Test;

import java.lang.reflect.Method;

public class MethodTest {

    @Test
    /**
     * 测试公有方法
     */
    public void demo1() throws Exception {

        Class<?> class1 = Class.forName("com.alan.entity.Person");
        //实例化
        Person person = (Person) class1.getDeclaredConstructor().newInstance();
        //获得公有方法
        Method method = class1.getMethod("eat");
        //执行方法
        method.invoke(person); //相当于person.eat();


    }

    @Test
    /**
     * 测试私有方法
     */
    public void demo2() throws Exception {

        Class<?> class1 = Class.forName("com.alan.entity.Person");
        //实例化
        Person person = (Person) class1.getDeclaredConstructor().newInstance();
        //获得私有方法
        Method method = class1.getDeclaredMethod("run");
        //设置私有方法访问权限
        method.setAccessible(true);
        //执行方法
        method.invoke(person);


    }

    @Test
    /**
     * 测试带参私有方法
     */
    public void demo3() throws Exception {

        Class<?> class1 = Class.forName("com.alan.entity.Person");
        //实例化
        Person person = (Person) class1.getDeclaredConstructor().newInstance();
        //获得私有方法
        Method method = class1.getDeclaredMethod("sayHello", String.class);
        //设置私有方法访问权限
        method.setAccessible(true);
        //执行方法
        String str = (String) method.invoke(person, "小鄂鄂");
        System.out.println(str);

    }

}

相关文章

  • 博客地址

    java注解-01、java注解-02、Git面试资源java反射-01、java反射-02、java反射-03为...

  • Java反射机制入门

    Java反射机制入门 一、什么是反射 JAVA反射机制(The JAVA reflection mechanism...

  • Java基础之反射

    Java基础之—反射(非常重要)Java中反射机制详解Java进阶之reflection(反射机制)——反射概念与...

  • 反射之一

    总结内容源自一下文章粗浅看java反射机制反射机制应用实践谈谈java反射机制Java Reflection(反射...

  • 反射之二

    总结内容源自一下文章粗浅看java反射机制反射机制应用实践谈谈java反射机制Java Reflection(反射...

  • Java基础之反射

    Java基础之反射 反射基本介绍 反射的使用通过反射调用属性和方法通过反射获取配置文件 反射基本介绍 Java反射...

  • Java 反射机制

    Java 反射机制 什么是反射 Java 反射是Java语言的一个很重要的特征,它使得Java具体了“动态性”。 ...

  • 一探究竟:Java反射效率低的原因到底在哪?

    预备知识 了解 Java 反射基本用法 看完本文可以达到什么程度 了解 Java 反射原理及 Java 反射效率低...

  • 面试官说:大家都说 Java 反射效率低,你知道原因在哪里么

    预备知识 了解 Java 反射基本用法 看完本文可以达到什么程度 了解 Java 反射原理及 Java 反射效率低...

  • Java面试题之JavaSE高级

    一、Java中的反射 1.说说你对Java中反射的理解 java中的反射首先是能够获取到Java...

网友评论

      本文标题:Java反射

      本文链接:https://www.haomeiwen.com/subject/dvchaftx.html