反射--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️以下取自互联网)
类的加载过程,
- 加载
- 验证(为了确保字节流符合虚拟机要求,且是安全的)
- 准备(为“类变量”--静态域分配内存。注意,这一步编译java代码,所以变量是默认值)
- 解析(将常量池中的“符号引用”替换为直接引用)
- 初始化
- 使用
- 卸载
其中,验证,准备和解析可以统称为连接
- 加载阶段,通过一个类的全限定名(绝对路径)来获取了定义此类的二进制字节流;将这个字节流代表的”静态存储结构“转化为方法区的运行时的数据结构
- 连接阶段,首先验证字节流,并为静态域分配存储空间,之后解析这个类创建的对其他类的引用
- 初始化,是类加载的最后一阶段,执行类的构造器(例如给连接阶段已经赋予默认值的变量进行赋值)
注意,如果反射一个类的时候,这个类还没有初始化,那么首先他需要初始化
标签:反射,name,System,public,println,String,没写,class,out 来源: https://www.cnblogs.com/lvdandan/p/11237306.html