java 反射

Class类是用于在jvm中表示一个类的类型信息,一个类在jvm中只会产生一个对应的Class对象。

类的加载与实例化 

//java 类在编译后会产生一个以.class结尾的字节码文件
//该文件内存储了Class对象的相关信息,Class对象表示的是类在运行时的类型信息
//Class与java.lang.reflect构成了java的反射技术
//当我们要使用类时,例如使用new 操作符实例化一个新对象,访问类的静态方法,
//jvm会先检查该类的有无加载,若有加载了就会直接进行相应的操作
//若检查到没有加载,jvm就会先去加载这个类的对应的字节码文件(这里会进行相应的检查)
//当加载成功后,就可以进行相应的操作了
public class ClassTest{
	public static void main(String [] args) throws Exception{
		System.out.println("before loading Circle.");
		// 可以指定要加载的类
		Class.forName("Circle"); // 这里需要捕获异常或者抛出异常到下一级
		System.out.println("after loading Circle.");
		System.out.println("before loading Rectangle.");
		Rectangle re = new Rectangle();
		System.out.println("after loading Rectangle.");
		System.out.println("************************************");
		System.out.println("before loading A1.");
		System.out.println(A1.trueFinal);
		
		System.out.println("before loading A2.");
		System.out.println(A2.noFinal);
		System.out.println("************************************");
		
		//使用类字面常量来得到Class,利用反射来构建实例对象(调用的是默认构造函数)
		// 调用类字面常量不会触发类的初始化
		Class<?> c = A3.class;
		System.out.println("before loading A3.");
		A3 a3 = (A3)c.newInstance();
		System.out.println("************************************");
		//根据运行结果:在继承关系里,在类的初始化时总是先初始化父类,在初始化子类
		//实例化时也是如此
		System.out.println("before loading D1.");
		D1 d1 = new D1();
	}
}

class Circle {
	static {
		//类在加载初始时,会执行这段static代码块
		System.out.println("loading Circle...");
	}
}

class Rectangle {
	static {
		//类在加载初始时,会执行这段static代码块
		System.out.println("loading Rectangle...");
	}
}

class A1 {
	// 编译期常量,不会触发类的初始化
	public static final int trueFinal = 10;
	
	static {
		//类在加载初始时,会执行这段static代码块
		System.out.println("loading A1...");
	}
}

class A2 {
	// 静态常量,触发类的初始化
	public static int noFinal = 5;
	static {
		//类在加载初始时,会执行这段static代码块
		System.out.println("loading A2...");
	}
}

class A3 {
	static {
		//类在加载初始时,会执行这段static代码块
		System.out.println("loading A3...");
	}
}

class B1 {
	static {
		System.out.println("loading B1");
	}
	public B1(){
		System.out.println("B1's instance");
	}
}

class D1 extends B1{
	static {
		System.out.println("loading D1");
	}
	public D1(){
		System.out.println("D1's instance");
	}
}

使用Class获取相关字段

public class AppEventLog extends AppBaseLog {
    private String eventId;                            //事件唯一标识
    private Long eventDurationSecs;                    //事件持续时长
    private Map<String, String> paramKeyValueMap;    //参数名/值对
    
    //getter&setter
}

public void test2() {
        Class<AppEventLog> c = AppEventLog.class;
        // 获取public字段
        Field[] fields = c.getFields();
        for(Field f : fields) {
            System.out.println(f.getName());
        }

        System.out.println("***************************");

        // 获取所有声明的字段,但不能获取父类的
        fields = c.getDeclaredFields();
        for(Field f : fields) {
            System.out.println(f.getName());
        }
    }


--out
***************************
eventId
eventDurationSecs
paramKeyValueMap

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值