黑马程序员_反射

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

 

 

Class 类

Java程序中各个java类属于同一类事物;描述这类事物的java类名就是Class。

Class类代表java类,它的各个实例对象代表类在内存中的字节码;一个类被类加载器加载到内存中,占用一段内存空间,这个空间里面的内容就是字节码;不同的类字节码也不同;
 
如何得到各个字节码对应的实例对象 (Class 类型 )

1、类名 .class 如 System.class;

2、对象 .getClass() 如 new person().getClass();

3、Class.forName(“ 类名 ”) 如 Class.forName("java.util.String");

9 个预定义Class实例对象:8个基本数据类型和void;


反射

反射 : 就是把 Java 类中的各种成分映射成相应的 java 类 .
一个类中的组成部分:成员变量,方法,构造方法,包等信息也用一个个java的类来表示;

1、Constructor类代表某个类中的一个构造方法

2、Field类,成员变量的反射

3、Method类,成员方法的反射

得到类中的某一个方法 :

  Method charAt = Class.forName("java.lang.String").getMethod("charAt", int.class);
 

下面是对Constructor类的一个反射实例

package cn.it.cast;

import java.lang.reflect.Constructor;

public class ReflectTest {
	public static void main(String[] args) throws Exception {
		
		//下面这行有处理异常ClassNotFoundException 谁知道有没有这个类
		//这是得到所有的构造方法
		Constructor[] constructors = Class.forName("java.lang.String").getConstructors();
		
		//得到某一个特定的构造方法有处理异常NoSuchMethodException谁知道有没有这个构造方法
		//注意,一个类的构造方法N 多,不可能用123去指定某一个特定的构造方法,只可以指定 参数 
		//这里getConstructor(StringBuffer.class);是1.5新的可变参数以前是数组类型参数
		//现在是Class<?>... parameterTypes
		Constructor constructor = Class.forName("java.lang.String").getConstructor(StringBuffer.class);
		
		//我现在要做一件事情newString(new StringBuffer("abc"));
		//我想用反射做
		//上面已经得到了那个构造函数,而且参数也是 StringBuffer的
		//Constructor类有一个重要的方法newInstance(arg0); 每call一次就弄一个新的
		//当然,参数不是StringBuffer也可以编译过,
		//编译器只管你这个是构造方法么就好了,管你是什么参数
		//编译器还不知道这个constructor是对应参数为StringBuffer的构造函数呢!!
		//甚至编译器连这个constructor 是哪个类的都不管
		// 编译器只知道这个是 Constructor的实例,这个实例有个方法叫newInstance,参数可变
		//编译器其他什么都不管
		//所以我们还要自己把结果 强制 转化为自己需要的类型(String)
		//但是到了runtime,JVM就清楚的知道了,
		//所以有运行时错误和编译时错误之分
		//就是说你现在传一个String类型,compiler不会说你错,但是你一运行,JVM就说不对了
		String myString = (String)constructor.newInstance(new StringBuffer("abc"));
		//test
		System.out.println(myString.charAt(2));
		
		//out c OK!S
		
		//上面的方式有三步,中间需要 constructor 
		//因为很多类都有规定必须要有无参构造函数,所以有个方法
		//Class.newInstance()直接call无参构造函数
		String s1 = (String)Class.forName("java.lang.String").newInstance();
		
		
		


---------------------- android培训java培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net/heima 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值