昆仑山:眼中无形心中有穴之穴人合一

夫君子之行,静以修身,俭以养德;非澹泊无以明志,非宁静无以致远。夫学须静也,才须学也;非学无以广才,非志无以成学。怠慢则不能励精,险躁则不能冶性。年与时驰,意与岁去,遂成枯落,多不接世。悲守穷庐,将复何及!

 

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  阅读(191)  评论(0编辑  收藏  举报

导航