作者:平凡特产小店 | 来源:互联网 | 2023-09-12 06:28
1.反射概述
反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;
对于任意一个对象,都能够调用它的任意一个方法和属性;
这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
反射就是把java类中的各种成分映射成一个个的Java对象
例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把各个组成部分映射成一个个对象。
(其实:一个类中这些成员方法、构造方法、在加入类中都有一个类来描述)
反射是框架设计的灵魂。
Java 反射相关的 API 在包 java.lang.reflect 中。
2.程序的运行过程
3.ClassLoader的类加载机制
并非一次性加载
需要的时候加载(运行期间动态加载)
static语句块在加载后执行一次
dynamic语句块每次new新的对象都会执行
等同于构造方法中的语句
用的较少
4.JDK中ClassLoader的分类
5.JDK中ClassLoader的层次关系
ClassLoader是一个抽象类,我们用它的实例对象来装载类 ,它负责将Java 字节码装载到 JVM 中 , 并使其成为 JVM 一部分。
各个对象之间的关系。
其中AppClassLoader在很多地方被叫做System ClassLoader
类加载器的顺序是:
先 是bootstrap classloader,然后是extensionclassloader,最后才是system classloader。大家会发现加载的Class越是重要的越在靠前面。这样做的原因是出于安全性的考虑,试想如果systemclassloader“亲自”加载了一个具有破坏性的“java.lang.System”类的后果吧。这种委托机制保证了用户即使具有一个这样的类,也把它加入到了类路径中,但是它永远不会被载入,因为这个类总是由bootstrap classloader来加载的。大家可以执行一下以下的代码:
System.out.println(System.class.getClassLoader());
将会看到结果是null,这就表明java.lang.System是由bootstrap classloader加载的,因为bootstrapclassloader不是一个真正的ClassLoader实例,而是由JVM实现的。
package com.reflection;import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/***反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;*对于任意一个对象,都能够调用它的任意一个方法和属性;*这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。**/
public class TestReflection {public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {String str = "com.reflection.Temp"; //这个类名可以是从配置文件中读取Class c = Class.forName(str); //加载类(class对象),forName()要加包名和类名不然找不到Object o = c.newInstance(); //实例化类Method[] methods = c.getMethods(); //获得所有方法for(Method m:methods) {if(m.getName().equals("m2"))m.invoke(o); //调用对象的方法,invoke(可变参数)if(m.getName().equals("m1")) {m.invoke(o, 1,2);for(Class parameter:m.getParameterTypes()) {System.out.println(parameter.getName());}}if(m.getName().equals("getS")) {Class returnType = m.getReturnType();System.out.println(returnType.getName());}}}}class Temp {static {System.out.println("Temp loaded!"); //被加载时观察输出}public Temp() {System.out.println("Temp constructed!");}int i;String s;public void m1(int i,int j) {this.i = i;System.out.println(i+" "+j);}public void m2() {System.out.println("m2 invoked!");}public String getS() {return s;}
}
/*
Temp loaded!
Temp constructed!
java.lang.String
1 2
int
int
m2 invoked!*/
参考:
Java基础之—反射
http://blog.csdn.net/sinat_38259539/article/details/71799078