黑马程序员:反射 reflect

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

反射: 就是把java类中的各种成分映射成相应的类。 java中的所有成员都可以用相应的反射API类的一个实例对象来表示,通过调用Class类的方法可以得到这些对象。

java.lang.reflect 中的主要类

一. Class类:

所有的类都可以向上抽象,在内存中就是一种字节码,于是Class类就是用来描述这些字节码的一个类。

java中获取字节码的方式有三种:

1.类名.class                         Class cls1 = System.class;

2.对象名.getClass()String str1= "";    Class cls2 = str1.getClass();

3.Class.forName("类名")Class cls3 = Class.forName("String")

4.primitive wrapper classes 基本数据类型对象包装类.TYPE  

java中有9个预定义对象不包括上面的第2.3 种方式,他们跟其他的类不一样,Primitive字节码,包括8个基本数据类型和void这个空返回值类型。

byte .ClassByte .TYPE
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
boolBoolean
voidVoid

isPrimitive()  方法用来判断一个字节码对象是不是primitive的。

因为内存中对于一个类只有一个字节码,因此判断类型相同的时候应该用== 而非equals。  int.Class == Integer.Type   但是int.class != Integer.getClass()

二. Method类

Method类描述了所有的方法。

Method    cls.getMethod(String name, Class... parameterTypes) 获取一个类中的指定方法

Method[]   cls.getDeclaredMethods()  获取所有的方法

三. Constructor 类  构造方法

Constructor .getConstructor(Class... parameterTypes)    

Constructor[].getConstructors()


四. Field类  类中定义的变量

      getField(String name)

getConstructors()

Field对象.setAccessible(boolean flag)  如果要操作某个私有的属性,要先设为true,使其具有可操作性。


练习:将一个类中的String类型的变量中的字符‘b’改为‘a’

import java.lang.reflect.*;
/**
 * @author Administrator
 *
 */
public class ReflectTest {


/**
 * Change all the String fields : change character 'a' to 'b'.
 * @author Administrator
 */
public static void changeString() throws IllegalAccessException{
	ReflectDemo1 rd1 = new ReflectDemo1("Lillian", "Shandong", "ball");
	Class<? extends ReflectDemo1> cls1 = rd1.getClass();
	Field[] fs1 = cls1.getDeclaredFields();
	for(Field field : fs1){
		if(field.getType() == String.class){
			field.setAccessible(true);
			String oldValue = (String) field.get(rd1);
			String newValue = oldValue.replace('a', 'b');
		
			field.set(rd1, newValue);
		}
		
	}
	
	System.out.println(rd1);
}

}
/**
 * A class ReflectDemo1, has a constructor with three parameters of String type.
 * 
 * @author Administrator
 *
 */
class ReflectDemo1{
	private String name="NoName";
	private String address="China";
	public String habit="NoHabit";
	
	public ReflectDemo1(String name, String address, String habit){
		this.name = name;
		this.address = address;
		this.habit = habit;
	}
	
	@Override
	public String toString(){
		
		return this.name+"...."+this.address+"..."+this.habit;
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值