注解 java.Annotation
Annotation是从JDK5.0开始引入的新技术
Annotation的作用
Annotation的格式
注解是以“@注释名”在代码中存在的,还可以添加一些参数值
例如:@SuppressWarnings(value = "unchecked")
Annotation在哪里使用
package com.taidou;
import java.lang.annotation.*;
//测试元注解
public class TestMetaAnnotation {
}
//表示注解可以用于方法
@Target(ElementType.METHOD)
//表示注解在运行时还有效
@Retention(RetentionPolicy.RUNTIME)
//表示注解可以被子类继承
@Inherited
//表示注解被加入到Javadoc中
@Deprecated
@interface MyAnnotation{
}
package com.taidou;
import java.lang.annotation.*;
//自定义注解
public class TestMyAnnotation {
@MyAnnotation2()
public static void main(String[] args) {
}
}
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation2{
String name() default "";
int age() default 0;
String[] shools() default {"清华","北大"};
}
java不是动态语言,但java可以称之为”准动态语言“。即java有一定的动态性,我们可以利用反射机制获得类似动态语言的特性,java的动态性让编程时能更加灵活
Reflection(反射)是java被称为动态语的关键,反射机制允许程序在执行期借助于ReflectionAPI取得任何类的内部信息,并直接操作任意对象的内部属性及方法。
Class c = Class.forName("java.lang.String");
反射:实例化对象——getClass()方法——达到完整的包类名称
获得Class对象的实例
package com.taidou;
public class Test {
public static void main(String[] args) throws ClassNotFoundException {
Person person = new Student();
//通过类获取
Class c1 = Student.class;
System.out.println(c1.hashCode());
//通过对象获取
Class c2 = person.getClass();
System.out.println(c2.hashCode());
//通过全类名获取
Class c3 = Class.forName("com.taidou.Student");
System.out.println(c3.hashCode());
//获取内置数据类型的Class
Class c4 = Integer.TYPE;
System.out.println(c4.hashCode());
//获取父类的
Class c5 = c1.getSuperclass();
System.out.println(c5);
}
}
class Person{
String name;
public Person() {
}
public Person(String name) {
this.name = name;
}
}
class Student extends Person{
public Student() {
this.name = "学生";
}
}
class Teacher extends Person{
public Teacher() {
this.name = "老师";
}
}
package com.taidou;
import java.lang.annotation.ElementType;
public class Test02 {
public static void main(String[] args) {
Class c1 = Object.class; //类
Class c2 = Runnable.class; //接口
Class c3 = String[].class; //一维数组
Class c4 = int[][].class; //二维数组
Class c5 = Override.class; //注解
Class c6 = ElementType.class; //枚举
Class c7 = Integer.class; //基本类型
Class c8 = void.class; //void
System.out.println(c1);
System.out.println(c2);
System.out.println(c3);
System.out.println(c4);
System.out.println(c5);
System.out.println(c6);
System.out.println(c7);
System.out.println(c8);
}
}
package com.taidou;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Test03 {
public static void main(String[] args) throws NoSuchFieldException, NoSuchMethodException {
Class c1 = User.class;
//获得类名
System.out.println(c1.getName());//包名+类名
System.out.println(c1.getSimpleName());//类名
System.out.println("---------------属性-----------------");
//获得类的属性
Field[] fields = c1.getFields();//只能找到public属性
fields = c1.getDeclaredFields();//能找到全部属性
for (Field field : fields) {
System.out.println(field);
}
Field name = c1.getDeclaredField("name");//获得指定的属性
System.out.println(name);
System.out.println("---------------方法-----------------");
//获得类的方法
Method[] methods = c1.getMethods();//获得本类及分类的所有public方法
for (Method method : methods) {
System.out.println(method);
}
methods = c1.getDeclaredMethods();//获得本类的所有方法
for (Method method : methods) {
System.out.println("Declared"+method);
}
c1.getMethod("setName", String.class);//获得指定的方法 有参方法要参数类型的Class对象
//获得构造器
System.out.println("---------------构造器-----------------");
Constructor[] constructors = c1.getConstructors();
for (Constructor constructor : constructors) {
System.out.println(constructor);
}
constructors = c1.getDeclaredConstructors();
for (Constructor constructor : constructors) {
System.out.println(constructor);
}
c1.getConstructor(String.class,int.class,int.class);//获取指定构造器
}
}
class User{
private String name;
private int age;
private int ID;
public User() {
}
public User(String name, int age, int ID) {
this.name = name;
this.age = age;
this.ID = ID;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", ID=" + ID +
'}';
}
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 int getID() {
return ID;
}
public void setID(int ID) {
this.ID = ID;
}
}
package com.taidou;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Test04 {
public static void main(String[] args) throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
Class c1 = User.class;
//创建一个对象
User user1 = (User) c1.newInstance();//本质是调用了无参构造器
System.out.println(user1);
//通过构造器创建对象
Constructor constructor = c1.getDeclaredConstructor(String.class, int.class, int.class);
User user2 = (User) constructor.newInstance("taidou", 18, 001);
System.out.println(user2);
//通过反射调用普通方法
Method setName = c1.getDeclaredMethod("setName", String.class);
setName.invoke(user1,"taidou1");//激活方法 传入对象与值
System.out.println(user1.getName());
//通过反射操作属性
Field name = c1.getDeclaredField("name");
//不能直接操作私有属性,需要关闭安全检查,true为关闭
name.setAccessible(true);
name.set(user2,"taidou2");
System.out.println(user2.getName());
}
}
package com.taidou;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Test05 {
public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
test1();
test2();
test3();
}
//普通调用
public static void test1(){
User user = new User();
long starTtime = System.currentTimeMillis();
for (int i = 0; i < 1000000000; i++) {
user.getName();
}
long endTime = System.currentTimeMillis();
System.out.println("普通方法:"+(endTime-starTtime)+"ms");
}
//反射方法调用
public static void test2() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
User user = new User();
Class c1 = user.getClass();
Method getName = c1.getDeclaredMethod("getName",null);
long starTtime = System.currentTimeMillis();
for (int i = 0; i < 1000000000; i++) {
getName.invoke(user,null);
}
long endTime = System.currentTimeMillis();
System.out.println("反射方法:"+(endTime-starTtime)+"ms");
}
//反射方法调用 关闭检测
public static void test3() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
User user = new User();
Class c1 = user.getClass();
Method getName = c1.getDeclaredMethod("getName",null);
getName.setAccessible(true);
long starTtime = System.currentTimeMillis();
for (int i = 0; i < 1000000000; i++) {
getName.invoke(user,null);
}
long endTime = System.currentTimeMillis();
System.out.println("反射方法,关闭检测:"+(endTime-starTtime)+"ms");
}
}
----------------------------------执行结果--------------------------------------------
普通方法:10ms
反射方法:3170ms
反射方法,关闭检测:1554ms
原文:https://www.cnblogs.com/taidou-hth/p/12370631.html