【Think in Java】学习笔记_Class对象
来源:互联网 发布:淘宝卖品牌要授权吗 编辑:程序博客网 时间:2024/05/16 12:44
学习自《think in java》chapter.14.类型信息
1,xxx.java文件经过编译后产生xxx.class文件,JVM根据该.class文件该类的产生Class对象。每个类都有Class对象,从Class对象中可以获得类的信息(构造,域,方法),生成实例对象,或者调用方法。
2,关于类加载,Java对类的加载是动态的,什么时候需要,什么时候加载,通常,当程序创建第一个类的静态成员的引用时,JVM检查该类是否有加载过,若无,则加载之。
eg: new Someth();//调用构造方法,而构造方法是静态的
此外,引用 static final的域不会初始化
3,Class.forName("包名.类名");返回该类的Class对象;
某类XXX.class 也是Class对象的引用;两者有什么区别?answer is : Class.forName("包名.类名")会顺便初始化类,而XXX.classz就不会初始化。
eg:
public class ClassLoad {public static void main(String[] args) {try {<strong>//得到一个类对象(对象的 Class对象),并且初始化类</strong>Class classA = Class.forName("t1.ClassA");} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}<strong>//.class(类字面常量)这样仅仅得到一个类的Class对象,但并未出始化</strong>Class classB = ClassB.class;System.out.println("<strong>在未使用类之前,引用类的static final值,不会被初始化</strong>");System.out.println("static fianl:"+ClassC.sf1);System.out.println("在未使用类之前,引用类的非static final静态域,会被初始化");//System.out.println("not static fianl:"+ClassC.sf2);ClassC.methodTest();}}// classclass ClassA{//初始化时候会执行静态语句static{System.out.println("ClassA is init");}}
public class ClassB{static{System.out.println("ClassB is init");}}class ClassC{public static final int sf1 = 10; public static int sf2 = 20; static{System.out.println("ClassC is init");}public static void methodTest(){System.out.println("static method in ClassC");}}结果:
ClassA is init在未使用类之前,引用类的static final值,不会被初始化static fianl:10在未使用类之前,引用类的非static final静态域,会被初始化ClassC is initstatic method in ClassC
4,若存在实例了 ,假设实例obj,obj.getClass(); 返回实例对应的类的类对象,即类的Class对象。
若存在类对象的引用,需要构造实例,用newInstance()方法,
eg Class c = XX.class;
Object obj = c.newInstance();
1)这种方式声明(Class c 非泛型方式)注意newInstance()返回的是Object,需要向下转型;
2)newInstance()方法需要类中声明了默认无参数构造方法;
3)Class<XXX> x = XXX.class; 通过泛型对类型有限制,x的引用到时候只能指向XXX的类对象了,那么x.newInstance();就不用向下转型了,返回的就是XXX的实例;这种方式最常用。Class<?> c基本等价于 Class c 就是不限制类型。
看一个小例子
/** *《think in Java 》 p321 */class CountedNumber{private static long counter;//初始化 为0private final long id = counter++; public String toString(){return Long.toString(id);}}class FieldList<T>{//类对象的成员private Class<T> type;public FieldList(Class<T> clz){this.type = clz;}public List<T> create(int n){List<T> list = new ArrayList<T>();try{for(int i = 0;i <n; i++ ){//通过类对象的引用构造实例list.add(type.newInstance());}}catch(Exception e){throw new RuntimeException();}return list;}}//Testpublic class Reflect {public static void main(String[] args) {FieldList<CountedNumber> fl = new FieldList<CountedNumber>(CountedNumber.class);System.out.println(fl.create(10));}}
- 【Think in Java】学习笔记_Class对象
- think in java 学习笔记
- 【笔记】Think in Java 对象导论
- Think in Java 笔记 01 对象导论
- Think in java 笔记
- think in java 笔记
- Think in java笔记
- think in java 笔记
- Think in java 笔记
- Think In Java 笔记
- Think in Java 笔记
- Think in Java笔记
- Think in Java 学习
- Think in Java反刍笔记(1)---对象是什么
- Think in Java反刍笔记(2)---对象是什么(2)
- Think in Java反刍笔记(3)---对象是什么(3)
- Think in Java 阅读笔记 (第一章 对象导论)
- Think in java 一切都是对象
- 利用缓存机制来实现对页面的优化
- JAVA EE-SESSION&COOKIE
- HDU 5895 Mathematician QSC(欧拉定理推广)
- AS汇编器源码剖析-第5章-用eclipse编译调试AS
- 【Thinking in Java】初始化与清理(一)
- 【Think in Java】学习笔记_Class对象
- 电信网络拓扑图自动布局之曲线布局
- 转算法方向了
- 探索跨平台应用开发的最佳实践
- Cannot change version of project facet Dynamic Web Module to 2.5
- Chapter 6:Kernel Methods
- JavaScript 中的this用法
- android studio 使用svn版本控制完全解析
- 五子棋的各种禁手