java之反射与泛型
反射:程序运行期间,java运行时系统始终为所有对象维护一各被称为运行时的类型标识,跟踪每个对象所属的类。虚拟机利用运行时类型选择相应的方法执行。eg:Employee e;Class cl = e.getClass();//try{String s ="java.util.Date";Object o =...
反射:
程序运行期间,java运行时系统始终为所有对象维护一各被称为运行时的类型标识,跟踪每个对象所属的类。虚拟机利用运行时类型选择相应的方法执行。
eg:
Employee e;
Class cl = e.getClass();
//
try{
String s ="java.util.Date";
Object o = Class.forName(s).newInstance();
Date d = (Date)o;
System.out.println(d.getTime());
}catch(Exception e){
e.printStackTrace();
}
此外说明
Class类中的getFields、getMethods、getConstructors方法返回类提供的public域、方法和构造器数组,其中包括超类的公有成员。Class类的getDeclareFields、getDeclareMethods、getDeclaredConstructors方法将分别返回类中声明的全部域、方法、和构造器,其中包括死有何保护成员,但不包括类的成员。
反射机制,可以实现对当前运行状态下各个类的成员、变量、方法的查看与调用。
泛型
类的泛型实现
eg:
public class Mutiply<T,E>{
T value1;
E value2;
public T getValue1(){
return value1;
}
public E getValue2(){
return value2;
}
}
方法的泛型实现
public static < T extends Comparable > T comparing(T t1,T t2){
if(t1.compareTo(t2)>=0)
return t1;
rturn t2;
}
泛型的关键点
泛型类和普通类在 java 虚拟机内是一样的。
eg:
List<String> l1 = new ArrayList<String>();
List<Integer> l2 = new ArrayList<Integer>();
System.out.println(l1.getClass() == l2.getClass());
打印的结果为 true 是因为 List 和 List 在 jvm 中的 Class 都是 List.class。
泛型信息被擦除了。
那么泛型是如何实现相关特性呢
泛型翻译
public class Erasure <T>{
T object;
public Erasure(T object) {
this.object = object;
}
}
Erasure 是一个泛型类,我们查看它在运行时的状态信息可以通过反射。
Erasure<String> erasure = new Erasure<String>("hello");
Class eclz = erasure.getClass();
System.out.println("erasure class is:"+eclz.getName());
打印结果
erasure class is:com.frank.test.Erasure
泛型在jvm中被擦除为Object类型,或者是泛型所继承的上限类
如上面的comparing类,擦除后是Comparable
利用反射和擦除,可以绕过编译调用非同类。(如下)
public static void fansheAndfanxing(){
List<Integer> ls = new ArrayList<>();
ls.add(1);
//ls.add("1");
Class c = ls.getClass();
try{
Method method = c.getDeclaredMethod("add",Object.class);
method.invoke(ls,"1");
for(Object o : ls)
System.out.println(o);
}
catch(Exception e){
e.printStackTrace();
}
}
更多推荐
所有评论(0)