美文网首页
Java反射

Java反射

作者: 慵懒的阳光丶 | 来源:发表于2019-06-19 15:29 被阅读0次

一.概念

  • 反射是动态语言的关键,反射机制允许程序在运行期间借助Reflection Api取得任何类的内部信息,可以直接操作对象的属性和方法。
  • java反射的核心是围绕java.lang.Class类展开的,同时提供了代表方法的类java.lang.reflect.Method,代表成员属性的类java.lang.reflect.Field,代表构造方法的类java.lang.reflect.Constructor等等
  • 反射是对字节码进行的各种操作,可以把Class看成对字节码的描述
图片.png

二.获取Class三种方式和Class常用方法

import org.junit.Test;
import reflect.Person;

import java.lang.reflect.Field;
import java.lang.reflect.Method;


public class ReflectTest {

    /**
     * 通过对象调用Object的getClass()获取Class
     */

    @Test
    public void test1(){
        Person person = new Person();
        Class clazz = person.getClass();
    }

    /**
     * 通过类的.class属性获得Class
     */
    @Test
    public void test2(){
        Class clazz = Person.class;

    }

    /**
     * 通过 Class.forName()静态方法传入要操作的类的全类名信息获得Class
     */
    @Test
    public void test3(){
        try {
            Class clazz = Class.forName("reflect.Person");
            //private修饰的属性无法通过getField直接获取
            //Field name = clazz.getField("name");
            //暴力获取方式
            Field name = clazz.getDeclaredField("name");
            //protected修饰的属性无法通过getField直接获取
            //Field age = clazz.getField("age");
            //默认修饰符修饰的属性无法通过getField直接获取
//            Field weight = clazz.getField("weight");
            Field gender = clazz.getField("gender");
            System.out.println(name);
//            System.out.println(age);
//            System.out.println(weight);
            System.out.println(gender);

            //获得Method的方式和Field类似,非public修饰的依旧需要通过暴力获取
//            Method goToSchool = clazz.getMethod("goToSchool", null);
            Method goToSchool = clazz.getDeclaredMethod("goToSchool", null);
            System.out.println(goToSchool);

            //通过反射获得类的全类名信息
            System.out.println(clazz.getName());

            //通过反射创建对象
            Person person = (Person) clazz.newInstance();
            System.out.println(person);


            ClassLoader classLoader = clazz.getClassLoader();
            //通过类加载器获取项目根目录
            String root = classLoader.getResource("").getPath();
            System.out.println(root);
            //通过类加载器获得指定文件路径
            URL resource = classLoader.getResource("reflect/test.txt");
            String path = resource.getPath();
            System.out.println(path);


        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

相关文章

  • 博客地址

    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/lutkqctx.html