其他分享
首页 > 其他分享> > 反射--class,没写完

反射--class,没写完

作者:互联网

package main.java;

public class Person {

    private int age;
    public String name;

    {
        age = 11;
        name = "yoyoyo";
    }

    static {
        System.out.println("Hello");
    }

    public Person() {

    }

    public Person(String name) {
        this.name = name;
        System.out.println(this.name);
    }

    public Person(int age, String name) {
        this(name);
        this.age = age;
    }

    public int getAge() {
        return age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void getInfo() {
        System.out.println("name:" + name + "; age:" + age);
    }

    public void setNum(double x) {
        x = 3 * x;
    }

    public void firstMethod(){
        System.out.println("This is first method");
    }

    private void secondMethod(){
        System.out.println("This is second method");
    }

    private String ThirdMethod(String arg){
        return "This is third method"+arg;
    }

    //但不代表public.isAccessible()会返回true,无论是public、protected、默认、还是private,isAccessible()都将返回false
        //System.out.println(field.isAccessible());
}
public class reflectClassTest {
    public static void main(String[] args) throws Exception{

        //这是一种方法
        Person person = new Person();
        //getClass是native代码,返回一个class的实例
        Class cperson = person.getClass();
        System.out.println("这是第一种方法:"+Modifier.toString(cperson.getModifiers())+" "+cperson.getName());

        //这是第二种方法
        Class cperson2 = Class.forName("main.java.Person");
        System.out.println("这是第二种方法:"+Modifier.toString(cperson2.getModifiers())+" "+cperson2.getName());

        //这是第三种方法
        Class cperson3 = Person.class;
        System.out.println("这是第三种方法:"+Modifier.toString(cperson3.getModifiers())+" "+cperson3.getName());
    }
}

根据Java核心技术卷1中的思路,当类名可以保存在字符串,并且可以在运行中改变,则推荐使用第二种方法。
根据Think in Java中的思路,Class.forName()生成的结果在编译阶段是不可知的。

这三种方法是有区别的(1️以下取自互联网)
类的加载过程,

  1. 加载
  2. 验证(为了确保字节流符合虚拟机要求,且是安全的)
  3. 准备(为“类变量”--静态域分配内存。注意,这一步编译java代码,所以变量是默认值)
  4. 解析(将常量池中的“符号引用”替换为直接引用)
  5. 初始化
  6. 使用
  7. 卸载

其中,验证,准备和解析可以统称为连接

  1. 加载阶段,通过一个类的全限定名(绝对路径)来获取了定义此类的二进制字节流;将这个字节流代表的”静态存储结构“转化为方法区的运行时的数据结构
  2. 连接阶段,首先验证字节流,并为静态域分配存储空间,之后解析这个类创建的对其他类的引用
  3. 初始化,是类加载的最后一阶段,执行类的构造器(例如给连接阶段已经赋予默认值的变量进行赋值)

注意,如果反射一个类的时候,这个类还没有初始化,那么首先他需要初始化

标签:反射,name,System,public,println,String,没写,class,out
来源: https://www.cnblogs.com/lvdandan/p/11237306.html