Java注解和反射
1. 注解
内置注解
@Override
: 定义在java.lang.Override
, 表示重写超类中方法的声明@Deprecated
: 表示不希望被使用@SuppressWarnings
: 用来抑制警告信息 参数 : all unchecked ......
元注解
@Target
: 注解的使用范围@Retention
: 在什么地方有效@Documented
: 将注解生成在javadoc
中@Inherited
: 子类继承父类注解自定义注解 : 再说
import java.lang.annotation.*; //去除警告 @SuppressWarnings("all") @Meta public class MetaAnnotation { @Meta public void test(){ } } //表示我们可以用在那些地方 可有多个参数 @Target(value = {ElementType.METHOD,ElementType.TYPE}) //表示在什么地方有效 SOURCE CLASS RUNTIME @Retention(value = RetentionPolicy.RUNTIME) //表示是否将注解生成在javadoc中 @Documented //表示子类继承父类注解 @Inherited //定义一个注解 @interface Meta { }
2. 反射
类 | 含义 |
---|---|
java.lang.Class | 整个字节码,一个类型,整个类 |
java.lang.reflect.Method | 字节码中的方法字节码,类中的方法 |
java.lang.reflect.Constructor | 字节码中的构造方法字节码,类中的构造方法 |
java.lang.reflect.Field | 字节码中的属性字节码,类中的成员变量(静态变量+实例变量) |
1. 概述
java.lang.reflect.*; //相关类在这个包下
反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;
对于任意一个对象,都能够调用它的任意一个方法和属性;
这种动态获取的信息
以及动态调用
对象的方法的功能称为 Java 语言的反射机制。
正常方式 : 引入所需要的包 --> 通过new实例化 -->取得实例化对象
反射方式 : 实例化对象 -->getClass()
方法 --> 得到完整的 '包类'名称
得到类名的几种方法 :
//1. getclass()
Student person = new Student();
Class c1 = person.getClass();
//2. 类名.class;
Class temp = Student.class;
//得到父类
Class superclass = c1.getSuperclass(); //上方的c1
//3. ForName("包+类")
2. ForName
Class aclass = Class.forName("com.reflection.Student");
//无参构造方法
Object o1 = aClass.newInstance();
//有参构造方法 有几个参数 getConstructor()里写几个
Constructor constructor = aclass.getConstructor(String.class, String.class); Object o1 = constructor.newInstance("Student", "ceshi");
//获取共有构造方法 getConstructors()
Constructor[] privateCon = aClass.getConstructors();
//获取私有构造方法 getDeclaredConstructors()
Constructor[] privateCon2 = aClass.getDeclaredConstructors();
for (int i = 0; i < privateCon2.length; i++) {
System.out.println(privateCon2[i]);
}
全部代码
package com.reflection;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class getClassTest {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
Student person = new Student();
//getClass()
Class c1 = person.getClass();
//ForName("包+类")
Class aClass = Class.forName("com.reflection.Student");
//无参构造方法
Object o = aClass.newInstance();
//有参构造方法
Constructor constructor = aClass.getConstructor(String.class, String.class);
Object o1 = constructor.newInstance("Student", "ceshi");
//获取私有构造方法
Constructor[] privateCon = aClass.getConstructors();
Constructor[] privateCon2 = aClass.getDeclaredConstructors();
for (int i = 0; i < privateCon2.length; i++) {
// System.out.println(privateCon2[i]);
}
// //类名.class;
Class s1 = Student.class;
// //得到父类
Class superclass = c1.getSuperclass();
}
}
class Person {
String name;
}
class Student extends Person {
public String sex;
public Student() {
super.name=" Atanycosts";
}
public Student(String name,String sex) {
System.out.println("有参调用成功");
super.name = name;
this.sex = sex;
}
private void Test(){
System.out.println("私有方法 , 通过.getDeclaredConstructors()方法获取");
}
@Override
public String toString() {
return "Student{" +'\n' +
" name = " + name + '\n' +
" sex = " + sex + '\n' +
'}';
}
}
1 条评论
想想你的文章写的特别好https://www.237fa.com/