反射:

程序运行期间,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();
        }

    }
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐