Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,
反射作用: 对于任何一个对象,都能够调用它的任意一个方法和属性.
要想解剖一个类,必须获取到该类的字节码文件对象,而解剖使用的就是Class类中的方法,所以先要获取到每一个字节码文件对应的Class类型的对象.
在程序运行期间,java运行时始终为所有的对象维护一个被称为运行时的类型标识,这个信息跟踪着每个对象所属的类,保存这些信息的类被称为 Class .
package src.test;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
class People {
private String name;
private int age;
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 People(String name, int age) {
this.name = name;
this.age = age;
}
}
public class Classreflection {
People P = new People("zhangsan", 19);
String name;
private Classreflection() {
}
public Classreflection(String main) {
System.out.println("调用带参数的构造器,并生成新的对象");
}
public void showWithnum(String num) {
System.out.println("获取带参数的方法");
}
public void showPublic() {
System.out.println("public方法");
System.out.println(P.getName() + "---" + P.getAge());
}
private void showPrivate() {
System.out.println("private方法");
}
public static void main(String[] args) {
try {
String classname = "src.test.Classreflection";
Class C = Class.forName(classname);
Object O = C.newInstance(); //返回这个对象的新实例
System.out.println(O);
Constructor[] constructor = C.getConstructors(); //获取类的构造器 调用类的无参构造方法
System.out.println(constructor);
//生成带参数的对象(通过带参数的构造器)
Class class2 = Class.forName(classname);
Constructor constructor1 = class2.getConstructor(String.class); //获取带参数的构造器
Object o2 = constructor1.newInstance("string ");
//获取类名
String name = C.getName();
System.out.println(name);
//获取带参数的方法并执行
Class class3 = Class.forName(classname);
Method method = class3.getMethod("showWithnum", String.class); //获取带参数的方法
// method.invoke("abc");
//调用私有方法的对象
Method method1 = class3.getDeclaredMethod("showPrivate");
System.out.println(method1);
} catch (Exception e) {
e.printStackTrace();
}
}
}
注解
注解主要是给编译器提供额外的信息,编译器可以通过额外的信息自动生成相应的代码,从而生成特定的功能
3 种标准注解类型: @Override、 @Deprecated、 @SupressWarning
4 种元注解类型: @Target、 @Retention @Documented @Inherited
-
@Override 注解 只能用于方法,不能用于其他类型(标记注解,无参)
-
@Deprecated 注解对过时的方法删除线处理(表示不建议使用)
@Deprecated
public void show(){
}
- @SuppressWarnings 注解类型
编译器除了提示错误信息之外, 还提供警告信息, 例如: 当类型强转时, 变量定义未使用时都会出现
编译时的警告信息。 - @Target 注解类型
@Target 为元注解, 只能标记用户自定义的注解类型。 表示该注解能用于什么地方, 可以附加的程序
实体。 @Target 带一个枚举类型的数组参数。 例: @Target({ElementType.METHOD})
1 ElementType.ANNOTATION_TYPE:注解类型的声明
2 ElementType.CONSTRUCTOR:构造方法的声明
3 ElementType.FIELD 域声明
4 ElementType.LOCAL_VARIABLE 局部变量声明
5 ElementType.METHOD 方法声明
6 ElementType.PACKAGE 包声明
7 ElementType.PARAMENT 参数声明
8 ElementType.TYPE 类, 接口(包括注解类型) 或 enum 声明