Class类

Class类的作用

  • 获取类的信息:类的名字、属性、方法、构造方法、父类、接口和注解等
  • 动态创建对象:可通过newInstance()方法
  • 动态调用方法:可用过Method对象的invoke()方法
  • 动态需改属性:通过Field对象的set()方法

动态调用方法实例:

静态方法无参情况:

@Slf4j
package com.luxifa

public class Student {
   public static void eat() {
		log.info("学生吃饭");
   }
}
@Slf4j
public class Application {
   	public static void main(String[] args) {
        Class<?> studentClass= Student.class;
        Method studentEat= studentClass.getMethod("eat");
        // 调用eat方法,参数是要调用方法的对象,如果方法为静态方法,则可传null
        studentEat.invoke(null);
	}
}

实例方法有参情况:

@Slf4j
public class Student {
    public Student () {
    }
    
   public static void eat(String something) {
		log.info("学生:"+something);
   }
}
@Slf4j
public class Application {
   	public static void main(String[] args) {
        Class<?> studentClass= Student.class;
        Method studentEat= studentClass.getMethod("eat",String.class);
        Student student = new Student();
        studentEat.invoke(student,"肉");
	}
}

动态修改属性示例:

public class Student {
    private String name;
    
    public Student(int name) {
        this.name= name;
    }

    public int getName() {
        return name;
    }

	public static void main(String[] args) {
        Student student = new Student("luxifa");

        Class<?> studentClass= student.getClass();
		Field field=studentClass.getDeclaredField("name");
		field.setAccessible(true);
		field.set(student , "degula");;
	}
}


获取Class对象的三种方式:

  • 类名.class
  • 对象.getClass()
  • Class.forName(类的全限名)

public class Reflect {
    public static void main(String[] args) {
        //类名.class
        Class stuClass1 = Student.class;
  
        //对象.getClass()  
        Student student = new Student();
        Class stuClass2 = student.getClass();//获取Class对象

        //Class.forName(类的全限名)
        Class stuClass3 = Class.forName("com.luxifa.Student");//包名加类名
    }
}
 

Class类的常用方法

  • forName():获取Class对象的一个引用,如果引用的类还没有被JVM加载,就立刻加载并初始化
  • getName():取全限定的类名(包括包名)
  • getSimpleName():获取类名(不包括包名)
  • getCanonicalName():获取全限定的类名(包括包名),大多数情况下和getName一样,但是在内部类、数组等类型的表示形式不同
  • isInterface():判断Class对象表示的是否是一个接口
  • getInterfaces():返回Class对象数组,对应Class对象所引用的类所实现的所有接口。
  • getSupercalss() :返回Class对象,表示Class对象所引用的类所继承的直接基类。
  • newInstance():返回一个Oject对象,是实现“虚拟构造器”的一种途径。使用该方法创建的类,必须带有无参的构造器。
  • getFields():获得某个类的所有的公共(public)的字段,包括继承自父类的所有公共字段。
    类似的还有getMethods和getConstructors。
  • getDeclaredFields():获得某个类的自己声明的字段,即包括public、private和proteced,默认但是不包括父类声明的任何字段。类似的还有getDeclaredMethods和getDeclaredConstructors。
  • newInstance():创建一个实例,只能调用默认构造器。
  • getsuperclass():返回class表示的实体超类的名称
  • getAnnotation(Class annotationClass):获取指定的注解

示例:获取Info类中,自定义注解MyAnnotation中的信息

//该注解可以应用于类、接口(包括注解类型)、枚举
@Target(ElementType.TYPE)
//被注解的元素包含在生成的Java文档中
@Documented
//该注解的生命周期,由JVM 加载,包含在类文件中,在运行时可以被获取到
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation{
    String name() default "luxifa";
    String value();
}
@MyAnnotation(name="德古拉",value="我是德古拉")
public class Info {

}
public class Test (Info info) {
    // 得到class对象
	Class<?> class = info.getClass();
	// 拿到MyAnnotation注解信息
	MyAnnotation myAnnotation = class.getAnnotation(MyAnnotation.class);
	log.info("name:{},value:{}",myAnnotation.name(),myAnnotation.value())
}

参考博客:
https://blog.csdn.net/weixin_46441425/article/details/122650785
https://blog.csdn.net/wdd199801140310/article/details/102922158

你可能感兴趣的:(开发语言,java)