java-反射初学(2)

package .com;

import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.util.Random;

/*
 * 本次学习RTTI: 即在运行时,识别一个对象的类型;
 * 第一部分:
 * Class类 :就像不同的人又Person 类 那么不同的类也有其类型Class类;
 * 每个类都有一个Class对象,换言之,每当编写并且编译一个新类,就会产生一个Class对象(被保存在一个同名的.class文件中)
 * 无论何时,只要我们想在运行时使用类型的信息或者知道那个对象的实际类型,就必须首先获得对这个Class对象的引用,有三
 * 种方式可以获得某个对象所对应的Class对象的引用:
 *  1.运用Class类中的静态方法:Class c = Class.forName("类的全限定名称");
 *      Class personClass = Class.forName("com.qian.Person");我们就拿到了指向Person这个字节码的引用,
 *  2.运用Object类中的静态方法:Class c = new Person().getClass();
 *  
 *  3.运用类字面常量方式:类名.class (Person.class);其不仅可以应有于普通的类,也可以应用于接口,数组,以及基本数据类型;
 *      对于基本数据类型的包装器类,还有一个标准的TYPE字段,TYPE字段也是一个引用,指向对应的基本数据类型的Class对象。
 *      int.class 等价于  Integer.TYPE;其次使用".class"来创建Class对象的引用时,不会自动地初始化该Class对象,区分与forName();
 * 
 * 加载----->链接------>初始化
 * 分析下面 Initate One-Three过程 可见 初始化有效的实现了尽可能的 惰性 
 *  仅使用 .class语法来获得对类的引用不会引发初始化;但是为了产生Class引用 Class.forName()立即就进行了初始化;
 *  对于编译期常量的处理:
 *      对于编译期常量JVM知道其具体是多少,所有它就不会在初始化类;例如下面的:
 *      System.out.println("InitateOne.staticFinalOne is:  "+InitateOne.staticFinalOne);只会输出47不会初始化静态代码块;
 *  对于只是将一个域设置为 static 和final的还不足以确保知道这个数确切值,此时就会对类进行初始化;例如下面:
 *      System.out.println("InitateOne.staticFinalTwo is:  "+InitateOne.staticFinalTwo);
 *  对于一个static域不是final的,那么在访问它是,总是要求在读取之前,要先进性链接(为这个域分配存储空间)和初试化(初始化该存储
 *      空间)例如:System.out.println("InitateTwo.staticNonFinal is:  "+InitateTwo.staticNonFinal);
 *  
 *  
 *  第二部分:
 *  Class的泛化;
 *   Class intClass = int.class;
 *         intClass = double.class;这样也是可以的,因为普通类的引用可以被指向任何其他的Class对象
 *   通配符 : ? 上面式子等价于 Class<?> intClass =int.class; intClass = double.class;
 *   范围界定:Class<? extends SuperClass>  和 Class<? super SonClass>
 *   
 *  
 *  
 *  
 *  
 * */
class InitateOne{
    final static int staticFinalOne = 47;
    static final int staticFinalTwo = ReflectTwo.rand.nextInt(500);

    static{
        System.out.println("Load InitateOne through static");   

    }
    public InitateOne(){
        System.out.println("Load InitateOne through default construct");
    }
}
class InitateTwo{
    static int staticNonFinal = 147;

    static{
        System.out.println("Load InitateTwo through static");   

    }
    public InitateTwo(){
        System.out.println("Load InitateTwo through default construct");
    }
}
class InitateThree{
    static int staticNonFinal = 74;

    static{
        System.out.println("Load InitateThree through static"); 

    }
    public InitateThree(){
        System.out.println("Load InitateThree through default construct");
    }
}
//练习泛型;
class SuperClass{
    private String name;
    SuperClass(){}
    SuperClass(String name){
        this.name = name;
    }
    public void eat(){
        System.out.println(name+"  super.eat");
    }
}
class SonClass extends SuperClass{
    private String sonName;
    SonClass(){}
    public SonClass(String sonName){
        super(sonName);
    }
    public void show(){
        System.out.println(sonName+" is show()");
    }
}
class SonClass2{
    private String sonName;
    SonClass2(){}
    public SonClass2(String sonName){
        this.sonName = sonName;
    }
    public void show2(){
        System.out.println(sonName+" is show2()");
    }
}
public class ReflectTwo {
    public static Random rand = new Random(47);

    public static void main(String[] args) throws Exception {
        //1.public T cast(Object obj)//将obj对象强制转换成Class对象所表示的接口或者类;(非继承和实现就报错)
//      SuperClass sup = SuperClass.class.cast(new SonClass());
        Class sc = Class.forName("GeneIterAdaptReflect.com.SonClass");
        Method[]  sms = sc.getMethods();
        for(Method m:sms){

            Type[] t =m.getTypeParameters();
            for(Type ty:t)
                System.out.println(m.getReturnType()+"  "+m.getName()+"("+ty.getTypeName()+")");
        }

    }
    public static void initateMethod(){
        Class InitateOneClass = InitateOne.class;
        System.out.println("after create InitateOne reference throught .class");
        System.out.println("InitateOne.staticFinalOne is:  "+InitateOne.staticFinalOne);
        System.out.println("InitateOne.staticFinalTwo is:  "+InitateOne.staticFinalTwo);
        System.out.println();
        /*打印结果:
         * after create InitateOne reference throught .class
         *InitateOne.staticFinalOne is:  47
         *Load InitateOne through static
         *InitateOne.staticFinalTwo is:  258
         * */

        System.out.println("InitateTwo.staticNonFinal is:  "+InitateTwo.staticNonFinal);
        /*打印结果:
         * Load InitateTwo through static
         *InitateTwo.staticNonFinal is:  147
         */
        System.out.println();

        Class InitateThreeClass = Class.forName("GeneIterAdaptReflect.com.InitateThree");
        /*打印结果:
         * Load InitateThree through static
         * */
        System.out.println("after crete InitateThree.class reference through forNAme()");
        System.out.println("InitateThree.staticNonFinal is:  "+InitateThree.staticNonFinal);
        /*
         * after crete InitateThree.class reference through forNAme()
         * InitateThree.staticNonFinal is:  74
         * */
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值