您当前的位置: 首页 >  Java

慕晨sekurlsa

暂无认证

  • 4浏览

    0关注

    82博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

JAVA基础(三十)——反射之Class类

慕晨sekurlsa 发布时间:2022-09-01 23:44:28 ,浏览量:4

一、目录
  • Class类介绍
  • Class类常用方法
  • 获取Class对象的方式
二、Class类介绍
  1. Class也是类,因此也继承Object类。
  2. Class类对象不是new出来的,而是系统创建的。
  3. 对于某个类的Class类对象,在内存中只有一份,因为类只加载一次。
  4. 每个类的实例都会记得自己是由哪个Class实例所生成。
  5. 通过Class可以完整地得到一个类的完成结构,通过一系列API操作而得到类的各个成员。
  6. Class对象是存放在堆的。
  7. 类的字节码二进制数据,是放在方法区的,有的地方称为类的元数据(包括方法代码、变量名、方法名、访问权限等)。
三、Class类常用方法 方法名功能forName(String name)返回指定类名name的Class对象newInstance()调用缺省构造函数,返回该Class对象的一个实例getName()返回此Class对象所表示的实体(类、接口、数组类、基本类型等)名称getMethod返回一个Method对象getClass()输出Class对象的运行类型getPackage()得到包名getField(String name)返回指定属性名的值set()通过反射给属性设值getFields()一次性拿到所有属性
package com.javareflection;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class JavaClass {
    public static void main(String[] args) throws Exception {

        // 1. 获取到Cat类对应的Class对象
        Class cls = Class.forName("com.javareflection.Cat");

        // 2. 输出Class对象的运行类型
        System.out.println(cls); //显示cls对象,是哪个类的Class对象  Class com.javareflection.Cat
        System.out.println(cls.getClass()); //输出cls的运行类型    Class java.lang.Class

        // 3. 得到包名
        System.out.println(cls.getPackage().getName());   //com.javareflection

        // 4. 得到类名
        System.out.println(cls.getName());  //com.javareflection.Cat

        // 5. 通过Class对象创建对象实例
        Object o = cls.newInstance();  //这里就可以直接向下转型了  Cat cat = (Cat)cls.newInstance();

        // 6. 通过反射获取属性值
        Field catname = cls.getField("catname");
        System.out.println(catname.get(o));

        // 7. 通过反射给属性设值
        catname.set(o, "Jerry");
        System.out.println(catname.get(o));

        // 8. 一次性拿到所有属性
        Field[] fields = cls.getFields();
        for(Field f : fields){
            System.out.println(f.getName());
        }

        // 9. 通过属性获取方法
        Method info = cls.getMethod("info");
        info.invoke(o);
        
    }
}


class com.javareflection.Cat
class java.lang.Class
com.javareflection
com.javareflection.Cat
Tom
Jerry
catname
age
The cat's name is Jerry
四、获取Class对象的方式
  1. 前提:已知一个类的全类名,且该类在类路径下,可通过Class类的静态方法forName()获取,可能抛出ClassNotFoundException,实例:Class cls = Class.forName(“xxx.xxx.Cat”);

    应用场景:多用于配置文件,读取类全路径,加载类。

  2. 前提:若已知具体的类,通过类的class获取,该方式最为安全可靠,程序性能最高。实例:Class cls = Cat.class;

    应用场景:多用于参数传递,比如通过反射得到对应构造器对象。

  3. 前提:已知某个类的实例,调用该实例的getClass()方法获取Class对象。实例:Class cls = 对象.getClass();

    应用场景:通过创建好的对象,获取Class对象。

  4. 通过类加载器得到Class对象

        Car car = new Car();
        ClassLoader classLoader = car.getClass().getClassLoader();
        Class cls = classLoader.loadClass("类的全类名");
    
  5. 基本数据类型(int、char、boolean、double等)按如下方式得到Class对象:Class cls = 基本数据类型.class;

  6. 基本数据类型对应的包装类,可以通过.TYPE得到Class类对象。Class cls = 包装类.TYPE;

关注
打赏
1663680270
查看更多评论
立即登录/注册

微信扫码登录

0.0374s