A a = (A)Class.forName(“pacage.A”).newInstance();

这和你 A a = new A(); 是一样的效果。

String className = “Example”;
class c = Class.forName(className);

 

1、如果你知道一个实例,那么你可以通过实例的“getClass()”方法获得该对象的类型类;/

2、如果你知道一个类型,那么你可以使用“.class”的方法获得该类型的类型类。

             //通过泛型新建对象。Class.forName()和A.class.h
//            Class<Son> a = Son.class;
try {
             Class a = Class.forName( "com.hao.class14.Son" );} catch (Exception e){
}
             System.out.println( "do=" +a.getName());
             //创建新的对象。
             Son b= (Son) a.newInstance();需要默认的构造方法,即先调用无参构造方法
Father b=  a.newInstance();
             if (b  instanceof  Son){ //向下转型
                 Son son = (Son)b;
             }
             b.do1();
             //创建父类对象
             Class<?  super  Son> c2 = a.getSuperclass(); //优于普通的Class
             ((Father)c2.newInstance()).do1();
             //class文件反射查询类的参数。
             Method[] ee = a.getDeclaredMethods();


出现的时期不同:

Class.forName()在运行时(类地址为字符串)加载(先找到class中的类):加载类,初始化静态方法。

        使用Class类的中静态forName()方法获得与字符串对应的Class对象

        运行期加载需要加上try。。。catch语句。

类字面常量Class.class和getClass()是在编译时加载类.不初始化,调用静态或非静态域时初始化。

1、.class用于类名,getClass()是一个final native的方法,因此用于类实例

2、.class在编译期间就确定了一个类的java.lang.Class对象;

3、.getClass()方法在运行期间确定一个类实例的java.lang.Class对象

调用Object类的getClass()方法来得到Class对象

 

//class文件反射查询类的方法,使用invoke调用。
             Method[] ee = a.getDeclaredMethods(); //该方法是获取本类中的所有方法,包括私有的(private、protected、默认以及public)的方法
             Method[] ee1 = a.getMethods(); //该方法是获取本类以及父类或者父接口中所有的公共方法(public修饰符修饰的)
             String [] names ={ "tom" , "tim" , "allen" , "alice" };
             try  {
                 Method m3 = ee[ 3 ];
                 m3.invoke(a.newInstance(), null );
                 Method m1 = a.getMethod( "do5" ,String. class );
                 for (String name:names)
                     m1.invoke(a.newInstance(),name);
             }  catch  (Exception e) {
                 e.printStackTrace();
             }
 
   Method echoMethod = classType.getMethod( "echo" ,
     new  Class[] { String.class });
   result = echoMethod.invoke(invokertester,  new  Object[] { "hello" });
   System.out.println(result);


泛型机制:

这种是jdk1.5引入的泛型机制,没有T这种类型,T是根据你输入的来动态匹配。加入你集合放入的String类型,那么你就可以使用List<String>,然后代码中所有出现T的地方都用String代替就可以了 ,放入的是Object类型,那么你就用List<Object>,

静态资源不认识泛型。

泛型三种:
          [1]ArrayList<T> al=new ArrayList<T>();指定集合元素只能是T类型
          [2]ArrayList<?> al=new ArrayList<?>();集合元素可以是任意类型,这种没有意义,一般是方法中,只是为了说明用法
          [3]ArrayList<? extends E> al=new ArrayList<? extends E>();
            泛型的限定:
               ? extends E:接收E类型或者E的子类型。
               ?super E:接收E类型或者E的父类型。