美文网首页
Java反射-基础

Java反射-基础

作者: 沐兮_d64c | 来源:发表于2018-04-03 11:23 被阅读0次

1,元数据存储

1)类信息在方法区(Perm代),Class对象在堆中方法区中有Class对象的引用。

image.png
2)Class类中包含的反射数据信息
image.png

2,基础

1)JVM加载class文件时,读入二进制字节流,将静态存储结构转化成方法区运行时数据结构,并在堆中创建一个对应的java.lang.Class对象,作为方法区这些数据的访问入口
2)Class对象包含了与类有关的信息,是类型信息在运行时的表示。
反射机制,对于任意一个类,在运行时,都能知道这个类的所有属性和方法;对于任意一个对象,都能调用它任意一个方法,访问任意属性。
3)要想在运行时使用类型信息,必须获取在堆中该Class对象的引用。
Class.forName("全名")加载类,并初始化类 在Perm方法区存储类信息,在堆中创建Class对象,返回Class对象的引用。
Base.class 使用类的static class属性,触发类的加载,不会初始化类,任何数据类型(包含基本类型)都有一个static的class属性。
Object#public final native Class<?> getClass(); 通过已实例化的对象获取Class对象的引用

image.png
4)反射:运行时打开和检查.class文件,运行时获得对象和类型的信息,动态加载类,动态访问以及调用目标类型的字段,方法以及构造函数。
5)通过obj.getClass()方法可以在运行时获得对象的信息,并且能访问对象的字段。Field[] fields = clazz.getDeclaredFields()

3,反射常用操作

java.lang.reflect包中,常用Class、Constructor、Field、Method等类。
1)通过反射获取构造函数
getDeclaredConstructors()all the constructors declared by the class

image.png
getConstructors() all the public constructors of the class
image.png
getContructor(Class<?>... parameterTypes)specified public constructor of the class image.png
getDeclaredConstructor(Class<?>... parameterTypes)specified constructor of the class
image.png
2)通过构造函数创建实例。Constructor-->newInstance(Object... initargs)
public T newInstance(Object ... initargs)constructor.newInstance("123", "456"); constructor.newInstance(null) 无参构造
底层还是使用native方法,private static native Object newInstance0(Constructor<?> var0, Object[] var1)
3)反射获取类的成员变量并访问
Field[] fields = clazz.getDeclaredFields();all the fields
Field[] fields = clazz.getFields();public fields
Field field = clazz.getField("nickname");specified public member field
Field field = clazz.getDeclaredField("nickname");the specified declared field
field.setAccessible(true); 解除私有限制
Class clazz = Account.class;
Account account = clazz.newInstance();
Field field = clazz.getDeclaredFiled("username");
field.setAccessible(true);
field.set(account, "hzq");

Filed类中set方法。public void set(Object obj, Object value)
obj the object whose field should be modified
value the new value for the field of obj
4)获取成员方法并调用。
Method[] method = clazz.getMethods();all the public methods
Method[] method = clazz.getDeclaredMethods()all the declared methods
Method method = clazz.getMethod(String name, Class<?>... parameterTypes);方法名和参数类型列表, specified public method
Method method = clazz.getDeclaredMethod(String name, Class<?>... parameterTypes);specified declared method

MyClass obj = clazz.newInstance();
Method method = clazz.getDeclaredMethod("privatePrint", String.class);
method.setAccessible(true);
method.invoke(obj, "halo 你好");

Method的public Object invoke(Object obj, Object... args)方法。
obj the object the underlying method is invoked from 调用谁的方法用谁的对象,如果方法是静态的,可以传null
args the arguments used for the method call

Class clazz = Integer.class;
Method method = clazz.getMethod("valueOf", String.class);
System.out.println((Integer)method.invoke(null, "123"));

相关文章

  • Java基础:反射

    反射注解动态代理相关阅读 Java基础:类加载器 Java基础:反射 Java基础:注解 Java基础:动态代理 ...

  • Java基础之反射

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

  • Java基础之反射

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

  • Java基础:注解

    系列阅读 Java基础:类加载器 Java基础:反射 Java基础:注解 Java基础:动态代理 1. 概述 注解...

  • Java高级知识

    反射 sczyh30 深入解析Java反射(1) - 基础深入解析Java反射(2) - invoke方法深入探究...

  • Java基础:动态代理

    系列阅读 Java基础:类加载器 Java基础:反射 Java基础:注解 Java基础:动态代理 概述 在运行时,...

  • java 反射进阶

    1.java反射基础 2.java反射进阶 上一节介绍了反射基础,本节介绍更深入的反射概念。 1.获取不到Clas...

  • java 反射基础

    1.java反射基础 2.java反射进阶 反射的两个显著的作用 反编译: .class —> .java 通过...

  • Java基础:类加载器

    系列阅读 Java基础:类加载器 Java基础:反射 Java基础:注解 Java基础:动态代理 1. 什么是类加...

  • 硬核干货!备战阿里,字节,腾讯 2020最新Java最常见面试题

    Java Java 基础这部分一些简单的问题就直接没有放上来。 基础: Java 反射?反射有什么缺点?你是怎么理...

网友评论

      本文标题:Java反射-基础

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