---------------------- android培训、java培训、期待与您交流! ----------------------
à40
反射的作用—>实现框架功能
我做房子卖给用户住,由用户自己安装门窗和空调,我做的房子就是框架,用户需要使用我的框架,把门窗插入进我写的框架中,框架与工具类有区别,工具类被用户的类调用,而框架则是调用用户提供的类;
因为在写程序时无法知道要被调用的类名,所以,在程序中无法直接new某个类的实例对象了,而要用反射方式来做。
package cn.itcast.day1;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Collection;
import java.util.Properties;
publicclass ReflectTest2 {
publicstaticvoid main(String[] args)throws Exception{
InputStream is=new FileInputStream("config.properties");
Properties pros=new Properties();
pros.load(is);
is.close();
String className=pros.getProperty("className");
Collection collections=(Collection)Class.forName(className).newInstance();
ReflectPoint pt1=new ReflectPoint(3,5);
ReflectPoint pt2=new ReflectPoint(5,5);
ReflectPoint pt3=new ReflectPoint(3,3);
ReflectPoint pt4=new ReflectPoint(3,5);
collections.add(pt1);
collections.add(pt2);
collections.add(pt3);
collections.add(pt4);
System.out.println(collections.size());
}
}
由内省引出JavaBean
IntroSpector(内省)àJavaBeanà特殊的Java类
Class Person
{
private int age;
public int getAge()
{
return age;
}
public setAge(int age)
{
this.age=age;
}
Ageà如果第二个字母是小的,则把第一个字母变成小的àage
gettimeàtime
getTimeàtime
getCPUàCPU
BeanInfo beanInfo=IntroSpector.getBeanInfo(pt1.getClass);
PropertyDescriptor[] pds=beaninfo.getPropertyDescriptors();
了解注解及java提供的几个基本注解:
@SuppressWarnings、@Deprecated、@Override
注解相当于一种标记,在程序中加入了注解就等于为程序打上了某种标记,没加,则等于没有某种标记,以后javac编译器,并发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事,标记可以加在包、类、字段、方法、方法的参数以及局部变量上。
注解就相当于一个你的源程序中要调用的一个类,要在源程序中应用某个注解,得先准备好这个注册类。就像你要调用某个类,得先开发好这个类。
注解类à应用了注解类的类à对“应用了注解类的类”进行反射操作的类
根据反射测试的问题,引出@Rentetion元注解:
RetetionPolicy.SOURCE、RetetionPolicy.CLASS、RetetionPolicy.RUNTIME;分别对应:java源文件àclass文件à内存中的字节码
泛型:
泛型是给编译器看的,我们可以通过反射跨过!
举例如下:
ArrayList<Integer> collection=new ArrayList();
collection.add(1);
System.out.println(collection.get(0));
collection.getClass().getMethod("add",Object.class)
.invoke(collection,"abc");
System.out.println(collection.get(1));
Arraylist<E>类定义和ArrayList<Integer>类引用中涉及如下术语:
*整个称为ArrayList<E>泛型类型
*ArrayList<E>中的E称为类型变量或类型参数
*整个ArrayList<integer>称为参数化的类型
*Arraylist<integer>中的Integer称为类型参数的实例或实际类型参数
*ArrayList<Integer>中的<>念着typrof
*Arraylist称为原始类型
在创建数组实例时,数组的元素不能使用参数化的类型,例如,下面的语句是错误的:
Vector<Integer>vectorList[ ]=new Vector<Integer>[10];
思考题:【结果:下面的代码不会报错,因为编译器是一行行编译代码】
Vector v1=new Vector<String>( );
Vector<object>v=v1;
泛型集合类的综合案例:
HashMap<String, Integer> maps=new HashMap<String, Integer>();
maps.put("田建", 21);
maps.put("黄琴", 21);
maps.put("朱师俊", 22);
maps.put("汤康",21);
Set<Map.Entry<String, Integer>> entrySet =maps.entrySet();
for(Map.Entry<String,Integer> entry:entrySet ){
System.out.println(entry.getKey()+":"+entry.getValue());
----------------------android培训、java培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net/heima