java注解和反射

一、注解:@+注释名

内置注解:

@Override:重写

@Deprecated:不推荐程序员使用

@SuppressWarnings("参数"):正压警告

元注解:

@Target:表示我们的注解可以放在哪些地方

@Retention:表示我们的注解在什么地方还有效,一般是在RunTime

@Document: 表示是否将我们的注解生成在Javadoc中

@Inherited: 子类可以继承父类的注解

自定义注解:

package 基础.week2.day13;
​
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
​
public class Demo1 {
    //自定义注解
    
    @MyAnnotation(name = "张三",schools = {"西安电子科技大学"})
    public void test(){}
    
    @MyAnnotation1("666")
    public void test1(){}
​
    //注解的值有多个:
    @Target({ElementType.TYPE,ElementType.METHOD})
    //ElementType.TYPE:能修饰类、接口或枚举类型
    @Retention(RetentionPolicy.RUNTIME)
    @interface MyAnnotation{
        //注解参数:参数类型+参数名
        String name() default "";
        int age() default 0;
        int id() default -1;//如果默认值为-1 不存在
​
        String[] schools() ;//没有default就要赋值
    }
​
    //注解的值有一个:
    @Target({ElementType.TYPE,ElementType.METHOD})
    //ElementType.TYPE:能修饰类、接口或枚举类型
    @Retention(RetentionPolicy.RUNTIME)
    @interface MyAnnotation1{
        String value();
    }
}
​

二、反射

动态语言:运行时可以改变自身结构(比如javaScript)

静态语言:与静态语言相对(比如java)

反射

反射(Reflection)是Java被视为动态语言的关键

package 基础.week2.day13;
​
public class Test1 {
    public static void main(String[] args) throws ClassNotFoundException {
        Class c1 = Class.forName("基础.week2.day13.User");
        Class c2 = Class.forName("基础.week2.day13.User");
        Class c3 = Class.forName("基础.week2.day13.User");
        Class c4 = Class.forName("基础.week2.day13.User");
        System.out.println(c1);
        //一个类在内存中只有一个Class对象
        //一个类被加载后,类的整个结构都会被封装在Class对象中
        System.out.println(c1.hashCode());
        System.out.println(c2.hashCode());
        System.out.println(c3.hashCode());
        System.out.println(c4.hashCode());
    }
}
class User{//实体类
    private String name;
    private int age;
​
    public User() {
    }
​
    public User(String name, int age) {
        this.name = name;
        this.age = 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;
    }
​
    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
​
class 基础.week2.day13.User
1324119927
1324119927
1324119927
1324119927
​
Process finished with exit code 0
​
package 基础.week2.day13;
​
public class Test2 {
    public static void main(String[] args) throws ClassNotFoundException {
​
        People people = new Studnet();
        System.out.println("这个人是:"+people.name);
        //获得Class对象
        //方式1:通过对象获得
        Class c1 = people.getClass();
        System.out.println(c1);
​
        //方式2:forname获取
        Class c2 = Class.forName("基础.week2.day13.Studnet");
        System.out.println(c2);
​
        //方式3:通过类名.class获得
        Class c3 = Studnet.class;
        System.out.println(c3);
​
        //方式4:基本内置类型的包装类都有一个Type属性
        Class c4 = Integer.TYPE;
        System.out.println(c4);
​
        //获得父类类型
        Class superclass = c1.getSuperclass();
        System.out.println(superclass);
​
    }
}
class People{
    public String name;
​
    public People() {
        this.name="人";
    }
​
    public People(String name) {
        this.name = name;
    }
​
    public String getName() {
        return name;
    }
​
    public void setName(String name) {
        this.name = name;
    }
​
    @Override
    public String toString() {
        return "People{" +
                "name='" + name + '\'' +
                '}';
    }
}
class Studnet extends People{
    public Studnet(){
        this.name="学生";
    }
}
class Teacher extends  People{
    public Teacher(){
        this.name="老师";
    }
}
​
这个人是:学生
class 基础.week2.day13.Studnet
class 基础.week2.day13.Studnet
class 基础.week2.day13.Studnet
int
class 基础.week2.day13.People
​
Process finished with exit code 0
​
package 基础.week2.day13;
​
import java.lang.annotation.ElementType;
​
public class Test3 {
    public static void main(String[] args) {
        //所有类型的Class
        Class c1 = Object.class;//Object
        Class c2 = Comparable.class;//接口
        Class c3 = String[].class;//数组
        Class c4 = String[][].class;//二维数组
        Class c5 = Override.class;//注解
        Class c6 = ElementType.class;//枚举类型
        Class c7 = Integer.class;//基本数据类型
        Class c8 = void.class;//void类型
        Class c9 = Class.class;//类类型
​
        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);
        System.out.println(c9);
    }
}
​
class java.lang.Object
interface java.lang.Comparable
class [Ljava.lang.String;
class [[Ljava.lang.String;
interface java.lang.Override
class java.lang.annotation.ElementType
class java.lang.Integer
void
class java.lang.Class
​
Process finished with exit code 0
​

类初始化

类不会发生初始化:1、子类调用父类的静态变量,子类不会初始化 2、子类调用自己的常量,子类和父类不会发生初始化 3、声明一个子类对象子类和父类也不会发生初始化

类加载器

package 基础.week2.day13;
​
public class Test4 {
    public static void main(String[] args) throws ClassNotFoundException {
        //类加载器
​
        //获取系统类的加载器
        ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
        System.out.println(systemClassLoader);
​
        //获取系统类加载器的父类加载器--> 扩展加载器
        ClassLoader parent = systemClassLoader.getParent();
        System.out.println(parent);
​
        //获取扩展加载器的父类加载器-->  根加载器
        ClassLoader parent1 = parent.getParent();
        System.out.println(parent1);
​
        //测试当前类是哪个加载器加载的
        ClassLoader classLoader = Class.forName("基础.week2.day13.Test4").getClassLoader();
        System.out.println(classLoader);//用户类加载器
​
        //测试JDK内置的类是谁加载的
        ClassLoader classLoader1 = Class.forName("java.lang.Object").getClassLoader();
        System.out.println(classLoader1);//null是根加载器
​
        //如何获得系统类加载器可以加载的路径
        System.out.println(System.getProperty("java.class.path"));
    }
}
​
jdk.internal.loader.ClassLoaders$AppClassLoader@63947c6b
jdk.internal.loader.ClassLoaders$PlatformClassLoader@4eec7777
null
jdk.internal.loader.ClassLoaders$AppClassLoader@63947c6b
null
D:\java_space\java\out\production\java基础学习
​
Process finished with exit code 0
​

类运行结构

package 基础.week2.day13;
​
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
​
public class Test5 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException {
        Class c1 = Class.forName("基础.week2.day13.User");
​
        //获取类名
        System.out.println(c1.getName());//包名+类名
        System.out.println(c1.getSimpleName());//类名
​
        //获取类的属性
        System.out.println("========");
//        Field[] fields = c1.getFields();  getFields()只能找到public属性
        Field[] fields = c1.getDeclaredFields();//getDeclaredFields能找到全部属性
        for (Field field : fields) {
            System.out.println(field.getName());
        }
​
        //获取类指定属性
        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);
        }
        System.out.println("============");
        Method[] declaredMethods = c1.getDeclaredMethods();//获取本类的所有方法
        for (Method declaredMethod : declaredMethods) {
            System.out.println(declaredMethod);
        }
        System.out.println("============");
​
​
        //获取指定方法
        //需要参数:重载
        Method getName = c1.getMethod("getName", null);
        Method setName = c1.getMethod("setName", String.class);
        System.out.println(getName);
        System.out.println(setName);
        System.out.println("============");
​
        //获取构造器
        Constructor[] constructors = c1.getConstructors();//获取本类的public构造器
        for (Constructor constructor : constructors) {
            System.out.println(constructor);
        }
        Constructor[] declaredConstructors = c1.getDeclaredConstructors();//获取本类中全部的构造器
        for (Constructor declaredConstructor : declaredConstructors) {
            System.out.println("%"+declaredConstructor);
        }
        System.out.println("====");
        //获取指定构造器
        Constructor declaredConstructor = c1.getDeclaredConstructor(String.class, int.class);
        System.out.println(declaredConstructor);
​
​
    }
}
​
基础.week2.day13.User
User
========
name
age
private java.lang.String 基础.week2.day13.User.name
===========
public java.lang.String 基础.week2.day13.User.getName()
public java.lang.String 基础.week2.day13.User.toString()
public void 基础.week2.day13.User.setName(java.lang.String)
public int 基础.week2.day13.User.getAge()
public void 基础.week2.day13.User.setAge(int)
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
============
public java.lang.String 基础.week2.day13.User.getName()
public java.lang.String 基础.week2.day13.User.toString()
public void 基础.week2.day13.User.setName(java.lang.String)
public int 基础.week2.day13.User.getAge()
public void 基础.week2.day13.User.setAge(int)
============
public java.lang.String 基础.week2.day13.User.getName()
public void 基础.week2.day13.User.setName(java.lang.String)
============
public 基础.week2.day13.User()
public 基础.week2.day13.User(java.lang.String,int)
%public 基础.week2.day13.User()
%public 基础.week2.day13.User(java.lang.String,int)
====
public 基础.week2.day13.User(java.lang.String,int)
​
Process finished with exit code 0
​

动态创建对象执行方法

package 基础.week2.day13;
​
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
​
public class Test6 {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
        //动态的创建对象
​
        //获取Class对象
        Class c1 = Class.forName("基础.week2.day13.User");
​
        //构造一个对象
        //User user = (User)c1.newInstance();//本质是调用了类的无参构造器,不能调用有参构造器
       //System.out.println(user);
​
        //通过构造器创建对象
        //Constructor declaredConstructor = c1.getDeclaredConstructor(String.class, int.class);
        //User user1 =(User) declaredConstructor.newInstance("张三", 24);
        //System.out.println(user1);
​
        //通过放射调用普通方法
        User user =(User) c1.newInstance();
        //通过反射获取一个方法
        Method setName = c1.getDeclaredMethod("setName", String.class);
        setName.invoke(user,"张三");//激活
        System.out.println(user.getName());
​
        //通过反射操作属性
        User user1 =(User) c1.newInstance();
        //user1.setName("大孙");
       // System.out.println(user1.getName());
        Field name = c1.getDeclaredField("name");
        name.setAccessible(true);//取消安全检测
        name.set(user1,"大勋");
        System.out.println(user1.getName());
​
​
​
    }
}
​
张三
大勋
​
Process finished with exit code 0
​

性能对比分析

package 基础.week2.day13;
​
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
​
public class Test7 {
    public static void main(String[] args) throws ClassNotFoundException, InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException {
        test1();
        test2();
        test3();
    }
​
    //普通方式调用
    public static void test1() {
        User user = new User("张三", 24);
        long start = System.currentTimeMillis();
        for (int i = 0; i < 1000000000; i++) {
            user.getName();
        }
        long end = System.currentTimeMillis();
        System.out.println("普通方式调用:"+(end-start)+"ms");
    }
​
    //反射方式调用 默认没有关闭检测
    public static void test2() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        //获取类对象
        Class c1 = Class.forName("基础.week2.day13.User");
        //获取类构造器
        Constructor declaredConstructor = c1.getDeclaredConstructor(String.class, int.class);
        //用反射来创建对象
        User user = (User) declaredConstructor.newInstance("张三", 24);
        //获取类方法
        Method getName = c1.getDeclaredMethod("getName", null);
        long start = System.currentTimeMillis();
        for (int i = 0; i < 1000000000; i++) {
            getName.invoke(user,null);
        }
        long end = System.currentTimeMillis();
        System.out.println("反射方式调用 默认没有关闭检测:"+(end-start)+"ms");
​
    }
    //反射方式调用,关闭检测
    public static void test3() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        //获取类对象
        Class c1 = Class.forName("基础.week2.day13.User");
        //获取类构造器
        Constructor declaredConstructor = c1.getDeclaredConstructor(String.class, int.class);
        //用反射来创建对象
        User user = (User) declaredConstructor.newInstance("张三", 24);
        //获取类方法
        Method getName = c1.getDeclaredMethod("getName", null);
        //关闭检测
        getName.setAccessible(true);
        long start = System.currentTimeMillis();
        for (int i = 0; i < 1000000000; i++) {
            getName.invoke(user,null);
        }
        long end = System.currentTimeMillis();
        System.out.println("反射方式调用,关闭检测:"+(end-start)+"ms");
​
    }
}
​

普通方式调用:10ms
反射方式调用 默认没有关闭检测:4273ms
反射方式调用,关闭检测:2050ms
​
Process finished with exit code 0
​

通过反射获取泛型

package 基础.week2.day13;
​
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;
​
//通过反射获取泛型
public class Test8 {
    public void test01(Map<String,User> map, List<User> users){
        System.out.println("test01");
    }
    public Map<String,User> test02(){
        System.out.println("test02");
        return null;
    }
​
    public static void main(String[] args) throws NoSuchMethodException {
        //拿到Test08这个类
        Method method = Test8.class.getMethod("test01", Map.class, List.class);
        //返回泛型的类型信息
        Type[] genericParameterTypes = method.getGenericParameterTypes();
        for (Type genericParameterType : genericParameterTypes) {
            System.out.println("#"+genericParameterType);//如果genericParameterType属于参数化类型( ParameterizedType)
            if(genericParameterType instanceof ParameterizedType){
                Type[] actualTypeArguments = ((ParameterizedType) genericParameterType).getActualTypeArguments();
                for (Type actualTypeArgument : actualTypeArguments) {
                    System.out.println(actualTypeArgument);
                }
                System.out.println("====");
            }
        }
​
        //获取返回值类型
        Method method1 = Test8.class.getMethod("test02", null);
        Type genericReturnType = method1.getGenericReturnType();
        if(genericReturnType instanceof ParameterizedType){
            Type[] actualTypeArguments = ((ParameterizedType) genericReturnType).getActualTypeArguments();
            for (Type actualTypeArgument : actualTypeArguments) {
                System.out.println(actualTypeArgument);
            }
        }
​
    }
​
}
​
#java.util.Map<java.lang.String, 基础.week2.day13.User>
class java.lang.String
class 基础.week2.day13.User
====
#java.util.List<基础.week2.day13.User>
class 基础.week2.day13.User
====
class java.lang.String
class 基础.week2.day13.User
​
Process finished with exit code 0
​

反射获取注解信息

package 基础.week2.day13;

import java.lang.annotation.*;
import java.lang.reflect.Field;

//练习反射操作注解
public class Test9 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {
        Class c1 = Class.forName("基础.week2.day13.Student2");

        //通过反射获得注解
        Annotation[] annotations = c1.getAnnotations();
        for (Annotation annotation : annotations) {
            System.out.println(annotation);
        }
        //获得注解的value的值
        Tablehe tablehe =(Tablehe) c1.getAnnotation(Tablehe.class);
        System.out.println(tablehe.value());

        //获取类指定的注解
        Field f = c1.getDeclaredField("name");
        Fieldhe annotation = f.getAnnotation(Fieldhe.class);
        System.out.println(annotation.columnName());
        System.out.println(annotation.type());
        System.out.println(annotation.length());
    }
}
@Tablehe("dataBase_Student")
class Student2{
    @Fieldhe(columnName = "dataBase_id",type = "int",length = 10)
    private int id;
    @Fieldhe(columnName = "dataBase_age",type = "int",length = 10)
    private int age;
    @Fieldhe(columnName = "dataBase_name",type = "varchar",length = 3)
    private String name;

    public Student2() {
    }

    public Student2(int id, int age, String name) {
        this.id = id;
        this.age = age;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Student2{" +
                "id=" + id +
                ", age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}

//类名的注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface Tablehe{
    String value();
}

//属性的注解
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface Fieldhe{
    String columnName();
    String type();
    int length();
}
@基础.week2.day13.Tablehe("dataBase_Student")
dataBase_Student
dataBase_name
varchar
3

Process finished with exit code 0
  • 38
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值