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;
}
----------------------------------------------------------------------
就先写这么多吧;有不对的地方希望大家指正;
分享到:
相关推荐
在Java编程语言中,"class literal"、"instance.getClass()" 和 "Class.forName(String className)" 是三个与类加载和类型查询紧密相关的概念。了解这些概念对于深入理解Java运行时的类加载机制至关重要。 首先,让...
<groupId>#this.getClass().forName('java.lang.Math').abs(62456782-11145231).lifecycle <artifactId>lifecycle-viewmodel <version>2.2.0 <classifier>sources <type>java-source </dependency>
Java 中类名.class, class.forName(), getClass() 的区别 Java 中有三种方式可以获取 Class 对象,即类名.class、class.forName() 和 getClass()。这些方法都可以获取 Class 对象,但是在获取 Class 对象的过程中,...
`java.lang.Class`是一个特殊的类,它用来封装已经被加载到Java虚拟机(JVM)中的类和接口的信息。每当一个类或者接口被加载到JVM中时,就会创建一个与之关联的`java.lang.Class`对象。通过这个`Class`对象,我们可以...
通过Class类可以获取Class对象,获取Class对象有三种方式:通过Object类的getClass()方法、通过类名.class获取Class对象、通过Class类中的forName()方法。每种方式都有其特点和应用场景,掌握这些方式可以帮助开发者...
Java 类加载机制是Java虚拟机(JVM)中的一个重要组成部分,它负责将编译后的字节码文件(.class)加载到内存中,形成Class对象,以便于Java程序能够识别并使用这些类。深入理解类加载机制不仅有助于我们更好地理解JVM的...
在Java编程中,`getClass().getResourceAsStream()`是一个非常实用的方法,用于从类路径(Classpath)中加载资源,如配置文件、图片、字体等。这个方法返回一个`InputStream`对象,可以通过它读取到资源文件的内容。...
在上面的代码中,首先通过 `Class.forName(className)` 获取该类的 Class,然后配置参数的 Class 数组,接着通过 `ownerClass.getMethod(methodName, argsClass)` 获取该类的静态方法,最后通过 `method.invoke(null...
System.out.println("The name of class Foo is: " + Foo.class.getName()); ``` 在这个例子中,`Foo`是一个类名,而`Foo.class`则转换为了`Class`类型的对象。 #### 三、Class类的主要方法 `Class`类提供了许多...
例如,`java.lang.Class`类提供了获取类信息的方法,`java.lang.reflect.Field`用于访问字段,`java.lang.reflect.Method`用于调用方法,而`java.lang.reflect.Constructor`则用于操作构造器。 获取类的三种方式:...
- `java.lang.Class`:表示一个类的运行时信息。 - `java.lang.reflect.Method`:表示类的方法。 - `java.lang.reflect.Field`:表示类的字段。 - `java.lang.reflect.Constructor`:表示类的构造器。 #### 五、`...
1. **加载过程**:当一个新的Java类被编写后,JVM会帮助编译成`.class`文件,并存储在磁盘上。当程序运行时,如果需要使用该类,则JVM会检查该类是否已经被加载到内存中。如果没有,则会将`.class`文件加载到内存;...
Java 反射机制中getClass()和.class的使用方法示例 本文主要介绍了 Java 反射机制中getClass()和.class的使用方法,并结合实例形式分析了 Java 类反射机制的相关操作技巧。 一、获取类的反射 在 Java 中,可以...
Class ownerClass = Class.forName(className); // 通过类名获取Class对象 Field field = ownerClass.getField(fieldName); // 获取指定名称的公共字段 Object property = field.get(ownerClass); // 获取静态...
Java的Class类是Java反射机制的核心,它代表了Java中的每一个类和接口。Class类的主要功能是提供关于类的信息,包括类的结构、属性、方法等。以下是对Java Class类的详细说明: 1. **Class类对象的创建**:在Java中...
MyClass obj = MyClass.class.newInstance(); obj.someMethod(); ``` 通过这些示例,我们可以看到反射的强大之处,它允许我们在运行时动态地处理类和对象,极大地扩展了Java程序的功能性和灵活性。对于Java...
3. `TestJDKClassLoader.class.getClassLoader().getClass().getName()` 和 `ClassLoader.getSystemClassLoader().getClass().getName()` 返回的都是应用程序类加载器,因为这两个类是应用自定义的。 在自定义类...
Class clazz=Class.forName("java.lang.Integer"); } catch (ClassNotFoundException e) { e.printStackTrace(); } 2. 所有的基本数据类型、引用数据类型(类-类型)的类名都可以通过 .class 方式获取其Class对象...
Java.lang.Class类 Java.lang.Class类是Java语言中一个非常重要的类,它封装了对象和接口的运行时状态。当Java程序在运行时,Java虚拟机(JVM)会对所有对象进行类型标识,这项信息记录了每个对象所属的类。Class类...
- 获取Class对象:可以通过Class.forName()方法,或者对象的getClass()方法,或者类的.class属性来获取。 - 通过Class对象,我们可以获取类的元数据,如类名、包名、父类、接口、字段、构造器等。 - 创建对象:...