您的位置:首页 > 编程语言 > Java开发

java零碎要点---class()、getClass()、Class.forName()、getClassLoader()的区别和联系--又不详细的地方求补充

2014-12-05 15:30 471 查看
2.注意:.class()、getClass()、Class.forName()、getClassLoader()的区别和联系

a.getClass(),是获取运行时的类:

一个java.lang.Class对象代表了Java应用程序在运行时所加载的类或接口实例,也就是

说被加载的类在JVM中以Class的实例存在,Class对象由JVM自动产生。通过Object的

getClass()方法来获取每一个对象对应的Class对象,或的Class对象之后可以用Class对

象上的方法取得类的信息。

例子:

String name="john";

//获得name对象的Class实例

Class stringClass=name.getClass();

//下面可以用stringClass实例获取name对象的相关信息,可以看API文档,这里只举两

// 个方法

System.out.println("name对象的类型:"+stringClass.getName());

System.out.println("name对象的父类:"+stringClass.getSuperclass().getName

());

b.Class.forName()是通过类名来获得类:

在一些应用程序中,无法事先知道用户将加载什么类,而必须用户指定类名称以加载类

,可以用Class的静态方法forName()方法实现动态加载类。

c.getClassLoader()是获得类的加载器。

例如String.class,代表的是调用字节码文件,来获取一个String的类型。

------------------------------------------------------------------------------

下面是一个完整的对getClass()和Class.forName()解释的例子,用到反射进行控制:

package com.credream.refelect;

import java.lang.reflect.*;

public class ClassDemo

{

public static void main(String[] args)

{

System.out.println("****************getClass()的例子*******************\n");

String name="john";

//获得name对象的Class实例

Class stringClass=name.getClass();

//下面可以用stringClass实例获取name对象的相关信息,可以看API文档,这里只举两个方



System.out.println("name对象的类型:"+stringClass.getName());

System.out.println("name对象的父类:"+stringClass.getSuperclass().getName());

/*结果:

* name对象的类型:java.lang.String

name对象的父类:java.lang.Object*/

System.out.println("\n****************forName()的例子*******************\n");

//举forName()的例子

//动态加载java.util.ArrayList类

//得到类的Class实例后利用Class的方法取得类相关信息

//里面有好多方法我就不解释了,你可以参考API文档

try

{

Class c=Class.forName("java.util.ArrayList");

int mod=c.getModifiers();//注意这里可以查看:Modifier类的源码,这里是给每一个修

饰符定义了一个int型的值;进行了转换

System.out.println("-------------Modifier.toString(mod)----------");

System.out.println(Modifier.toString(mod));

System.out.println("-------------Modifier.toString(mod)----------");

if(Modifier.isInterface(mod)){//判断是否是一个接口,如果是就打印出来

System.out.print(" interface");

}

else{

System.out.print(" class ");//

System.out.println(c.getName()+"{");//java.util.ArrayList{

System.out.println("\t//********成员变量**********");

Field[] field=c.getDeclaredFields();//得到所有变量的数组

for(Field f:field)

{

System.out.println("------------Modifier.toString(f.getModifiers

()------------");

System.out.println("\t"+Modifier.toString(f.getModifiers()));//得到变量的修饰

符:private static final

System.out.println("------------Modifier.toString(f.getModifiers

()------------");

System.out.println("-----------f.getType().getName

()-----------------------");

System.out.println(" "+f.getType().getName());//得到变量的类型名字: long

System.out.println("-----------f.getType().getName

()-----------------------");

System.out.println(" "+f.getName()+";");//得到变量的名字:serialVersionUID;

}

System.out.println("\t//********构造方法**********");

Constructor[] constructor=c.getDeclaredConstructors();//

for(Constructor con:constructor)

{

System.out.print("\t"+Modifier.toString(con.getModifiers()));//得到构造方法的

修饰符public

System.out.println(" "+con.getName()+"();");//得到构造方法的名字

java.util.ArrayList();

}

System.out.println("\t//*********成员方法*************");

Method[] method=c.getDeclaredMethods();

for(Method mhd:method)

{

System.out.print("\t"+Modifier.toString((mhd.getModifiers())));//获得成员方法

的修饰符public

System.out.print(" "+mhd.getReturnType().getName());//获得成员方法的返回类

型;void

System.out.println(" "+mhd.getName()+"()");//获得成员方法的name:add()

}

System.out.println("}");

}

}

catch(Exception e)

{

e.printStackTrace();

}

}

}

----------------------------------------------------------------------------

下面是:Modifier类的源码:

由于篇幅太长贴出部分代码:

----------------------------------------

public static final int PUBLIC = 0x00000001;

public static final int PRIVATE = 0x00000002;

--------------------------------------------------------

public static String toString(int mod) {

StringBuffer sb = new StringBuffer();

int len;

if ((mod & PUBLIC) != 0)sb.append("public
");

if ((mod & PROTECTED) != 0)sb.append("protected
");

if ((mod & PRIVATE) != 0)sb.append("private
");

/* Canonical order */

if ((mod & ABSTRACT) != 0)sb.append("abstract
");

if ((mod & STATIC) != 0)sb.append("static
");

if ((mod & FINAL) != 0)sb.append("final
");

if ((mod & TRANSIENT) != 0)sb.append("transient
");

if ((mod & VOLATILE) != 0)sb.append("volatile
");

if ((mod & SYNCHRONIZED) != 0)sb.append("synchronized
");

if ((mod & NATIVE) != 0)sb.append("native
");

if ((mod & STRICT) != 0)sb.append("strictfp
");

if ((mod & INTERFACE) != 0)sb.append("interface
");

if ((len = sb.length()) > 0)/*
trim trailing space */

return sb.toString().substring(0, len-1);

return "";

}

----------------------------------------------

public static boolean isAbstract(int mod) {

return (mod & ABSTRACT) != 0;

}

---------------------------------------------------

public static boolean isInterface(int mod) {

return (mod & INTERFACE) != 0;

}

----------------------------------------------------------------------

就先写这么多吧;有不对的地方希望大家指正;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐