黑马程序员_java基础学习笔记11_反射

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


    
    反射就是把Java类中的各种成分映射成相应的java类.例如,一个java类中用一个Class类的对象来表示,一个类中的组成部分包括:成员变量,方法,构造方法,包等等.信息也用一个个的java类来表示.就像一个汽车类,汽车上的发动机,变速箱等等也是一个个的类.表示java类的Class类显然要提供一系列的方法,来获得其中的变量,方法,构造方法,修饰符,包等信息,这些信息就是用相应类的实例对象来表示,它们是Field,Method,Contructor,Package等等.
    一个类中的每个成员都可以用相应的反射API类的一个实例对象来表示,通过调用Class类的方法可以得到这些实例对象,我们需要学习这些实例的用法.
    这里有三个方法提供我们获得各个字节码对应的实例对象,它们都是Class类型:
1.类名.class  例如:System.class
2.对象.getClass()  例如:new Date().getClass()
3.Class.forName("类名")  例如:Class.forName("java.util.Date")
    Constructor类  代表某个类中的一个构造方法.
得到某个类所有的构造方法如:
Constructor constructor[] = Class.forName("java.lang.String").getConstructor();
得到某一个构造方法:
Constructor constructor[] = Class.forName("java.lang.String").getConstructor(StringBuffer.class);
创建实例对象:
通常的方法:String str = new String(new StringBuffer("abc"));
    反射方法:String str = (String)constructor.newInstance(new StringBuffer("abc"));
Class.newInstance()方法:
例如:String obj = (String)Class.forName(java.lang.Sttring").newInstance();
此方法内部先得到默认的构造方法,然后用该构造方法创建实例对象
成员变量的反射 Field类代表反射某个类中的一个成员变量
得到的Field对象是对应到类上面的成员变量,并不是对象的对象.当类的某个成员变量的修饰符是private,直接通过getField方法和getDeclaredField方法获得Field类型的对象就会出现错误.可以通过暴力反射的方式解决,使用setAccessible(true)使private类型的成员变量可以被获取值.
    成员方法的反射   Method类代表某个类中的成员方法
调用方法: 通常方式:System.out.println(str.charAt(1));
 反射方式:System.out.println(charAt.invoke(str, 1));

当传递给Method对象的invoke()方法的第一个参数是null时,说明该Method对象对应的是一个静态方法. JDK1.4和 JDK1.5的invoke方法的区别:
JDK1.4:public Object invoke(Object obj,Object[] args)
JDK1.5:public Object invoke(Object obj,Object... args)
即按JDK1.4的语法,需要将一个数组作为参数传递给invoke方法时,这时它会把一个数组作为一个元 素。
这时如果我们要取出其中的元素,需要将数组中的元素通过数组一个个的取出。
所以,调用charAt方法的代码也可以用JDK 1.4改写为 charAt.invoke("str"new Object[]{1})形 式。
    数组与Object的关系及其反射类型
具有相同维数和元素类型的数组属于同一类型,即具有相同的Class实例对象.
代表数组的Class实例对象的getSuperClass()方法返回的父类为Object类对应的Class.
基本类型的一维数组可以被当作Object类型使用,不能当作Object[]类型使用;非基本类型的一维数组,既可以当作Object类型使用,又可以当作Object[]类型使用.
    Array工具类用于完成对数组的反射操作.
注意:当一个对象被存储进HashSet集合中以后,就不能修改这个对象中的那些参与计算哈希值的字段了,否则,对象修改后的哈希值与最初存储进HashSet集合中时的哈希值就不同了,在这种情况下,即使在contains方法使用该对象的当前引用作为的参数去HashSet集合中检索对象,也将返回找不到对象的结果,这也会导致无法从HashSet集合中单独删除当前对象,从而造成内存泄露。
    框架的概念以及用反射技术开发框架的原理
框架与工具类的区别在于,工具类被用户的类调用,而框架则是调用用户提供的类.
在程序中无法直接new某个类的实例对象时,需要用反射方式来做.
用类加载器的方式管理资源和配置文件
import java.io.FileInputStream; 
import java.io.InputStream; 
import java.util.Collection; 
import java.util.Properties; 
public class ReflectTest { 
public static void main(String[] args)throws Exception { 
//InputStream is = new FileInputStream("config.properties");

//方式一:采用类加载器进行加载,使用相对路径的方式 
/*InputStream is=ReflectTest.class.getClassLoader(). 
getResourceAsStream("com/itheima/day01/config.properties");*/ 

//方式二:利用Class方式进行加载,使用相对路径的方式 
//InputStream is = ReflectTest.class.getResourceAsStream("config.properties"); 

//方式三:利用Class方式进行加载,使用绝对路径的方式 
InputStream is = ReflectTest.class.getResourceAsStream("/com/itheima/ReSource/config.properties"); 
Properties p = new Properties(); 
p.load(is); 
is.close(); 

String className = p.getProperty("className"); 
Collection collection = (Collection)Class.forName(className) .newInstance(); 

collection.add("黑马程序员"); 
collection.add("黑马论坛"); 
collection.add("CSDN社区"); 
collection.add("黑马程序员"); 
System.out.println(collection.size()); 
<span style="white-space:pre">	</span>} 
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值