反射
反射概述:
举个例子吧!
eg1:
:
eg2:
一、获取Class对象
获取Class对象有三种方法。
1、Class . forName("全类名") ; ->最为常用
2、类名 . class ->一般当做参数传递
3、对象 . getClass() ; ->已经有这个类的对象时才可调用
代码演示:
package Power_demo.demoI_Reflect;
public class reflect_demo1 {
public static void main(String[] args) throws Exception {
//第一种方式:
Class clazz1 = Class.forName("Power_demo.demoI_Reflect.Student");
//第二种方式:
Class clazz2 = Student.class;
//第三种方式:
Student stu = new Student();
Class clazz3 = stu.getClass();
System.out.println(clazz1);
System.out.println(clazz2);
System.out.println(clazz3);
System.out.println(clazz1 == clazz2);
System.out.println(clazz2 == clazz3);
}
}
运行结果如下:
二、获取构造方法
代码演示:
package Power_demo.demoI_Reflect;
import java.lang.reflect.Constructor;
public class reflect_demo2 {
public static void main(String[] args) throws Exception {
//1、获取class字节码文件
Class clazz = Class.forName("Power_demo.demoI_Reflect.Student");
//2、获取构造方法--方法一
Constructor[] cons = clazz.getConstructors();
for(Constructor con:cons){
System.out.println(con);
}
//2、获取构造方法--方法二
Constructor[] cons2 = clazz.getDeclaredConstructors();
for (Constructor con2 : cons2) {
System.out.println(con2);
}
System.out.println("-------------获取单个构造方法-------------");
//2、获取构造方法--方法三
Constructor con3 = clazz.getConstructor();
System.out.println(con3);
//2、获取构造方法--方法四
Constructor con4 = clazz.getDeclaredConstructor();
System.out.println(con4);
}
}
三、获取成员变量
代码演示:
package Power_demo.demoI_Reflect;
import java.lang.reflect.Field;
public class reflect_demo3 {
public static void main(String[] args) throws Exception{
//1、获取字节码文件
Class clazz = Class.forName("Power_demo.demoI_Reflect.Student");
//2、获取成员变量--方法一
Field[] fies = clazz.getFields();
for (Field fie : fies) {
System.out.println(fie);
}
//2、获取成员变量--方法二
Field[] fies2 = clazz.getDeclaredFields();
for (Field fie2 : fies2) {
System.out.println(fie2);
}
System.out.println("------------获取单个成员变量------------");
//2、获取成员变量--方法三
Field money = clazz.getField("money");
System.out.println(money);
//2、获取成员变量--方法四
Field name = clazz.getDeclaredField("name");
System.out.println(name);
System.out.println("-------------获取其他--------------");
//3、获取权限修饰符
int modifiers = name.getModifiers();
System.out.println(modifiers);
//4、获取成员变量的名字
String name1 = name.getName();
System.out.println(name1);
//5、获取成员变量的数据类型
Class<?> type = name.getType();
System.out.println(type);
}
}
四、获取成员方法
代码演示:
package Power_demo.demoI_Reflect;
import java.lang.reflect.Method;
public class reflect_demo4 {
public static void main(String[] args) throws Exception{
//1、获取字节码文件
Class clazz = Class.forName("Power_demo.demoI_Reflect.Student");
//2、获取方法对象--方法一(所有、不含私有、含父类方法)
Method[] mets = clazz.getMethods();
for (Method method : mets) {
System.out.println(method);
}
System.out.println("------------------------");
//2、获取方法对象--方法二(所有、含私有和公共、不含父类方法)
Method[] mets2 = clazz.getDeclaredMethods();
for (Method method : mets2) {
System.out.println(method);
}
System.out.println("------------获取单个方法------------");
//2、获取成员变量--方法三(单个、不含私有)
Method method = clazz.getMethod("eat");
System.out.println(method);
//2、获取成员变量--方法四(单个、含私有)
Method eat = clazz.getDeclaredMethod("eat");
System.out.println(eat);
System.out.println("------------获取其他------------");
//3、获取修饰符
int modifiers = eat.getModifiers();
System.out.println(modifiers);
//4、获取方法的名字
String name = eat.getName();
System.out.println(name);
}
}
注解
注解概述
注解是什么?
现在我们就可以自定义注解了!
一、自定义注解
代码演示:
package Power_demo.demoJ_Annotation;
//自定义注解
public @interface MyBook {
String name();
int age() default 18; //default:默认值
String[] address();
//特殊属性value: 在使用时如果只有一个value属性,value名称可以不写
String value() default "今天2025高考";
}
如何使用注解?
package Power_demo.demoJ_Annotation;
@MyBook(name="张三",age = 19,address = {"北京","香港"},value = "2025")
public class Annotation_demo1 {
@MyBook(name="杰瑞",age = 19,address = {"东京","纽约"},value = "2023")
public static void main(String[] args) {
}
}
二、元注解
@Target:表示注解的目标。
@Retention:表示注解的保留周期。
1.定义注解
package Power_demo.demoJ_Annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
@Target(ElementType.METHOD) //表示注解的作用目标是方法
@Retention(RetentionPolicy.RUNTIME) //表明注解在编译运行时保留(一直活着)
public @interface MyTest {
}
2.使用注解
package Power_demo.demoJ_Annotation;
public class Annotation_demo2 {
// @MyTest //报错!'@MyTest' 不适用于字段
private int age;
public Annotation_demo2(){}
@MyTest //只可以注解方法
public void first() {}
@MyTest
public static void main(String[] args) {
}
}