Java代码如何获取Class类呢?
我们都知道在java中万物皆对象,那么我们定义的Class类在JVM中也是一个对象,如何获取这个对象呢?下文笔者讲讲述以下几种获取方法
如下所示方式1:调用运行时类的属性
例:
如下所示
获取Class类的四种方法
方式1: 调用运行时类的属性: 类名称.class 方式2: 通过运行时类的对象的getClass方法 方式3: 调用Class的静态方法:forName(全类名) 方式4: 使用类加载器: ClassLoader中的loadClass(全类名)方式获取 注意事项: Class类在JVM有且只有一份
获取Class类的用途
动态创建Class对象 动态修改Class对象中的值 使用Class类的对象方法,可使程序更易扩展例: 获取Class类的示例
定义一个Class类
public class Person { private String name; private int age; public String addr; static{ System.out.println("静态代码块儿..."); } { System.out.println("动态构造块儿..."); } public Person() { } public Person(String name, int age, String addr) { this.name = name; this.age = age; this.addr = addr; } private Person(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getAddr() { return addr; } public void setAddr(String addr) { this.addr = addr; } public void show(){ System.out.println("hello,I am is person"); } private String showNation(String nation){ System.out.println("guojia:"+ nation); return nation; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + ", addr='" + addr + '\'' + '}'; } }
方式1:调用运行时类的属性
类名称.class
例:
private static Class getaClassMethod1() throws NoSuchMethodException, InstantiationException, IllegalAccessException, java.lang.reflect.InvocationTargetException { //1、方式一 调用运行时类的属性:.class Class clss= Person.class; System.out.println(clss); System.out.println("方式一创建Constructor对象开始"); Constructor constructor = clss.getConstructor(String.class, int.class, String.class); System.out.println("方式一创建Constructor对象结束"); System.out.println("方式一创建 Person对象开始"); Object o = constructor.newInstance("maomao", 18, "shenzhen"); System.out.println("方式一创建 Person对象结束"); Person p = (Person)o; System.out.println(p); System.out.println("方式一结束"); return clss; }
/** class com.java265.javabase.reflect.Person 方式一创建Constructor对象开始 方式一创建Constructor对象结束 方式一创建 Person对象开始 静态代码块儿... 动态构造块儿... 方式一创建 Person对象结束 Person{name='maomao', age=18, addr='济宁'} 方式一结束 */
方式2:使用运行时类的对象的getClass方法
private static Class getClassMethod2() throws NoSuchMethodException, InstantiationException, IllegalAccessException, java.lang.reflect.InvocationTargetException { //2、方式二 通过运行时类的对象的getClass方法 System.out.println("方式二开始"); Person forReflect = new Person(); Class aClass = forReflect.getClass(); System.out.println(aClass); System.out.println("方式二创建Constructor对象开始"); Constructor constructor = aClass.getConstructor(String.class, int.class, String.class); System.out.println("方式二创建Constructor对象结束"); System.out.println("方式二创建 Person对象开始"); Object o = constructor.newInstance("maomao", 18, "shenzhen"); System.out.println("方式二创建 Person对象结束"); Person p = (Person)o; System.out.println(p); System.out.println("方式二结束"); return aClass; } /** * 方式二开始 静态代码块儿... 动态构造块儿... class com.java265.javabase.reflect.Person 方式二创建Constructor对象开始 方式二创建Constructor对象结束 方式二创建 Person对象开始 动态构造块儿... 方式二创建 Person对象结束 Person{name='maomao', age=18, addr='shenzhen'} 方式二结束 */
方式3:使用Class的静态方法:forName(全类名)
private static Class getaClassMethod3() throws ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalAccessException, java.lang.reflect.InvocationTargetException { //3、方式三 调用Class的静态方法:forName(classPath) System.out.println("方式三开始"); Class aClass = Class.forName("com.java265.javabase.reflect.Person"); System.out.println(aClass); System.out.println("方式三创建Constructor对象开始"); Constructor constructor = aClass.getConstructor(String.class, int.class, String.class); System.out.println("方式三创建Constructor对象结束"); System.out.println("方式三创建 Person对象开始"); Object o = constructor.newInstance("maomao", 18, "shenzhen"); System.out.println("方式三创建 Person对象结束"); Person p = (Person)o; System.out.println(p); System.out.println("方式三结束"); return aClass; } /** * 方式三开始 静态代码块儿... class com.java265.javabase.reflect.Person 方式三创建Constructor对象开始 方式三创建Constructor对象结束 方式三创建 Person对象开始 动态构造块儿... 方式三创建 Person对象结束 Person{name='maomao', age=18, addr='shenzhen'} 方式三结束 */
方式4:使用类加载器:ClassLoader中的loadClass(全类名)方式获取
private static Class<?> getaClassMethod4() throws ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalAccessException, java.lang.reflect.InvocationTargetException { //4、方法四 使用类加载器:ClassLoader System.out.println("方式四开始"); ClassLoader classLoader = ReflectTest1.class.getClassLoader(); Class<?> aClass3 = classLoader.loadClass("com.java265.javabase.reflect.Person"); System.out.println(aClass3); System.out.println("方式四创建Constructor对象开始"); Constructor constructor = aClass3.getConstructor(String.class, int.class, String.class); System.out.println("方式四创建Constructor对象结束"); System.out.println("方式四创建 Person对象开始"); Object o = constructor.newInstance("maomao", 18, "shenzhen"); System.out.println("方式四创建 Person对象结束"); Person p = (Person)o; System.out.println(p); System.out.println("方式四结束"); return aClass3; } /** * 方式四开始 class com.java265.javabase.reflect.Person 方式四创建Constructor对象开始 方式四创建Constructor对象结束 方式四创建 Person对象开始 静态代码块儿... 动态构造块儿... 方式四创建 Person对象结束 Person{name='maomao', age=18, addr='shenzhen'} 方式四结束 */
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。