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;
}
----------------------------------------------------------------------
就先写这么多吧;有不对的地方希望大家指正;
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;
}
----------------------------------------------------------------------
就先写这么多吧;有不对的地方希望大家指正;