黑马程序员_反射学习心得

------- android培训java培训、期待与您交流! ----------

Java的所有类都有一个与之对应的Class类的对象,用来描述类的属性,如:类名,包名,构造器(Constructor),成员变量(Field),成员方法(Method)……每个Class对象对应一份字节码。

 

获得某个类的Class对象,有三种方法(以String类为例):

1.      String.class;

2.      Class.forName(“java.lang.String”);

3.      String str = “abc”;  str.getClass();


9个预定义的Class对象:

boolean, byte, char, short, int, long, float,double, void

 

基本类型的包装类封装了常量TYPE保存基本类型的Class对象(字节码)

 

数组也是一种类型,有对应的Class对象


反射

反射就是把java类中的各种成分映射成相应的java类。

import java.lang.reflect.*;

public class TestClass {
	
	public static void main(String[] args) throws Exception {
		A a = new A();
		
		Class cls1 = A.class;
		Class cls2 = Class.forName("A");
		Class cls3 = a.getClass();
		
		System.out.println(cls1.isPrimitive());//是否是9个基本类型之一
//		System.out.println(void.class.isPrimitive());
		a = (A)cls1.newInstance();
		
		System.out.println("int[] isArray : " + int[].class.isArray());
		
		String className = cls1.getName();//取得类名
		Package pak = cls1.getPackage();//取得类所在的包名
		/**
		 * 构造方法反射
		 */
		Constructor con = cls1.getConstructor(null);//取得具有指定参数列表的public构造器
		Constructor[] cons = cls1.getConstructors();//取得所有public构造器
		A b = (A)con.newInstance(null);//通过构造器创建实例对象
		/**
		 * 成员变量反射
		 */
		Field fld1 = cls1.getField("str1");//取得具有指定名字的public字段
		Field fld2 = cls1.getDeclaredField("str4");
		fld2.setAccessible(true);
		Field[] flds = cls1.getFields();//取得所有public字段
		String s = (String)fld2.get(a);
		fld1.set(a, "abc");
		System.out.println(a.str1);
		for(Field field : flds) {
			if(field.getType()==String.class) {//getTpe()取得字段的类型
				String ss = (String)field.get(a);
				ss = ss.replace('a', 'b');
				field.set(a, ss);
			}
		}
		System.out.println(a.str1);
		
		/**
		 * 成员方法反射
		 */
		Method mhd = cls1.getMethod("f1", null);//取得指定名称和指定参数列表的public方法
		Method[] mhds = cls1.getMethods();//取得所有public方法
		mhd.invoke(a, null);
		
	}

}
class A {
	
	public String str1 = "aaa";
	protected String str2 = "bbb";
	String str3 = "ccc";
	private String str4 = "ddd";
	
	public A() {
		
	}
	
	public void f1() {
		System.out.println("f1 is invoked.");
	}
	
	protected void f2() {
		
	}
	
	void f3() {
		
	}
	
	private void f4() {
		
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值