Java 反射技术
类的加载·
当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化。
加载·
就是指将class文件读入内存,并为之创建一个Class对象。
任何类被使用时系统都会建立一个Class对象。
```·
## 连接·
验证 是否有正确的内部结构,并和其他类协调一致·
准备 负责为类的静态成员分配内存,并设置默认初始化值
解析 将类的二进制数据中的符号引用替换为直接引用·
初始化就是我们以前讲过的初始化步骤
# 类初始化时机。
创建类的实例
·访问类的静态变量,或者为静态变量赋值
·调用类的静态方法
·使用反射方式来强制创建某个类或接口对应的java.lang.Class对象
·初始化某个类的子类
·直接使用java.exe命令来运行某个主类
# 类加载器
类加载器
·负责将.class文件加载到内在中,并为之生成应的Class对象。
·虽然我们不需要关心类加载机制,但是了解这个机制我们就能更好的理解程序的运行。
类加载器的组成
·Bootstrap ClassLoader 根类加载器
·Extension ClassLoader扩展类加载器
·System ClassLoader 系统类加载器
# 类加载器的作用
Bootstrap ClassLoader根类加载器·
也被称为引导类加载器,负责Java核心类的加载
·比如Svstem.String等。在JDK中JRE的lib目录下rtjar文件中
.Extension ClassLoader扩展类加载器·
负责JRE的扩展目录中jar包的加载。
· 在JDK中JRE的lib目录下ext目录.
Sysetm ClassLoader系统类加载器·
负责在JVM启动时加载来自java命令的class文件,以及classpath环境变量所指定的jar包和类路径
# 反射
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
其实一句话总结:
反射:就是通过class文件对象,去使用该文件中的成员变量,构造方法,成员方法。
要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法所以先要获取到每一个字节码文件对应的Class类型的对象.
要想这样使用,首先你必须得到class文件对象,其实也就是得到Clas s类的对象。
Class类:
成员变量 Field
构造方法 Constructor
成员方法 Method
获取class文件对象的方式:
A:object类的getClass()方法
B:数据类型的静态属性class
C: Class类中的静态方法 //开发推荐这个
public static Class forName(String className) //注意 带上包名全路径的类名 为什么呢?因为第三种是一个字符串,而不是一个具体的类名。这样我们就可以把这样的字符串配置到配置文件中。
# User
package com.shanghai.wanson;
import java.io.PrintStream;
public class User {
private int age;
private String name;
public User() {
}
public User(String name) {
this.name = name;
}
public User(int age, String name) {
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void printName(){
System.out.println("my name is "+name);
}
}
# Person
package com.shanghai.wanson;
public class Person {
private String name;
private static int numPeople=0;
public Person(String name) {
this.name = name;
numPeople++;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static void printPerson(Person person){
System.out.println(person.getName());
}
}
# Driver
package com.shanghai.wanson;
import java.io.File;
import java.lang.invoke.MethodHandle;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Driver {
public static void main(String[] args) {
/**
* getDeclaredFiled--->getField
* getDeclaredMethod--->getMethod
*/
Person person=new Person("wanson");
//System.out.println(person.name);//不可访问
try{
Field filed=person.getClass().getDeclaredField("name");
filed.setAccessible(true);
System.out.println(filed.get(person));
}catch (Exception e){
e.printStackTrace();
}
//System.out.println(Person.numPeople);
try{
Field filed=Person.class.getDeclaredField("numPeople");
filed.setAccessible(true);
System.out.println(filed.get(null));
}catch (Exception e){
e.printStackTrace();
}
System.out.println(person.getName());
try{
Method method=person.getClass().getDeclaredMethod("getName");
System.out.println(method.invoke(person));
}catch (Exception e){
e.printStackTrace();
}
person.setName("china");
System.out.println(person.getName());
person.setName("USA");
try{
Method method=person.getClass().getDeclaredMethod("setName",String.class);
method.invoke(person,"shanghai");
System.out.println(person.getName());
}catch (Exception e){
e.printStackTrace();
}
Person.printPerson(person);
try{
Method method=Person.class.getDeclaredMethod("printPerson", Person.class);
method.invoke(null,person);
}catch (Exception e){
e.printStackTrace();
}
Person other=new Person("lilei");
Person.printPerson(other);
try{
Constructor<Person> constructor=Person.class.getDeclaredConstructor(String.class);
other=constructor.newInstance("indian");
Person.printPerson(other);
}catch (Exception e){
e.printStackTrace();
}
}
}
posted on 2018-09-13 13:39 Indian_Mysore 阅读(195) 评论(0) 编辑 收藏 举报