自定义注解
使用@interface自定义注解(自动继承了java.lang.annotation.Annotation接口)
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
public class Annotation {
//举例
@MyAnnotation(name = "Lily",age = 18)
public void test(){
}
}
/**
* 元注解
* @Target 用于描述注解的使用范围
* @Retention 表示需要在什么级别保存该注释信息,用于描述注解的生命周期(SOURCE<CLASS<RUNTIME)
* @Document 说明该注解将被包含在javadoc中
* @Inherited 说明子类可以继承父类的该注解
*/
@Target({ElementType.TYPE,ElementType.METHOD})//可作用在类或者方法上
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation{
//以下是的注解参数,不是方法:参数类型+参数名()
String name() default "";
int age();
int id() default -1;
String[] school() default {"西北大学","清华大学"};
}
获得Class对象
//创建Class对象的方式
public class GetClass {
public static void main(String[] args) throws ClassNotFoundException {
Person person = new Student();
//方式一 通过对象获得
Class c1 = person.getClass();
//方式二 forname获得
Class c2 = Class.forName("com.test.GetClass");
//方式三 通过类名.class获得
Class<Student> c3 = Student.class;
//获得父类类型
Class superclass = c1.getSuperclass();
}
}
//父类
class Person{
public String name;
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
'}';
}
public Person(String name) {
this.name = name;
}
public Person() {
}
}
//子类
class Student extends Person{
public Student() {
this.name = "学生";
}
}
Class类的常用方法
类加载器
public class Test {
public static void main(String[] args) {
//获得系统类的加载器
ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
System.out.println(systemClassLoader);
//获得扩展类加载器
ClassLoader parent = systemClassLoader.getParent();
System.out.println(parent);
//获得根加载器(C/C++编写,无法获取,获取值为null)
ClassLoader parent1 = parent.getParent();
System.out.println(parent1);
//测试当前类有哪个类加载器加载
ClassLoader classLoader = Class.forName("com.test.Test").getClassLoader();
System.out.println(classLoader);
//获得系统加载器可加载的路径
System.out.println(System.getProperty("java.class.path"));
}
}
动态操作对象
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
//获得class对象
Class user = Class.forName("com.test.User");
//调用了无参构造
User user1 = (User) user.newInstance();
//通过构造器创建对象
Constructor constructor = user.getDeclaredConstructor(String.class);
User user2 = (User)constructor.newInstance("ok");
//通过反射调用对象方法
Method method = user.getDeclaredMethod("setName", String.class);
method.invoke(user1,"ok1");
//通过反射操作属性,不能直接操作私有属性
User user3 = (User) user.newInstance();
Field field = user.getDeclaredField("name");
field.setAccessible(true);//关闭安全检查,操作私有属性
field.set(user3,"okokok");
System.out.println(user3.getName());
}
}
class User{
private String name;
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public User(String name) {
this.name = name;
}
public User() {
}
}
----参考b站up主:遇见狂神说