关于注解和反射

注解

:框架的基础,给程序看的解释 java 1.5出现
内置注解
@Override 重写 覆盖父类的方法
@Deprecated 已过时的,不建议实际用,但是可以使用,可以存在更好的方式,调用多个-
@SuppressWaring(“call”) 镇压警告

元注解
@Target (value = ElementType.Method) 表示注解可以用在哪些地方
@Retention(value=RetenionPolicy.RUNTIME) 在什么地方有效
@Documented 是否生成javadoc中
@Interited 继承

自定义注解

用@interface来声明一个注解 格式为public @interface 注解名称{}
1.其中每一个方法实际声明了一个配置参数 方法名称就是参数的名称
2.返回类型就是参数的类型,返回值只能是基本类型Class,String,enum
3.可以用default来申明参数的默认值,如果只有一个参数,一般为value,写参数时就不用加value= ,如果是其他命令 就必须加,默认规定
4.注解元素必须优质,经常使用空字符串和0作为默认值

反射

反射机制 java.reflection 使得java变成一个动态语言
创建对象 new ,clone ,反射(运行时创建对象) bean底层也是反射
java是静态语言,反射使其变成准动态语言,在程序运行时
类加载完就成一个class对象,反射就是一个镜子,反过来的

优点:动态常见对象,在程序运行的时候改变其结构
缺点: 性能降低

主要API:
java.lang.Class:一个类
reflect.method 代表类的方法
reflect.Field 成员变量
reflect.Constructor 类的构造器

反射的方法 主要得到Class
Class aclass = Class.forName(“类的路径”)
Object类中的getClass 所有的对象的只有一个class

Class本身也是一个类,
一个java的类在jvm只有一个class实例

获取class的实例

1.Class clazz = Person.class

2 Class clazz = person.getClass()

3.Class clazz = Class.forName(“路径”)

基本数据类型可以通过.Type

反射测试代码:
package com.kang;

public class Person {
private String name;
private String age;

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

public Person(){};
public String getName() {
    return name;
}

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

public String getAge() {
    return age;
}

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

public Person(String name, String age) {
    this.name = name;
    this.age = age;
}

}
package com.kang;

import org.springframework.http.converter.json.GsonBuilderUtils;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class reflection {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchFieldException {
//获得class ,就是反射用的镜子
Class clazz = Class.forName(“com.kang.Person”);
Person person = new Person();
Class personClass = person.getClass();

     //获得类的包名和类型

    String name = clazz.getName();//包名+类名
    String simpleName =clazz.getSimpleName();//类名
    System.out.println("name"+name+"     simple"+simpleName);
    //只能获得public修饰属性
    Field[] fields=clazz.getFields();
    for (int i = 0; i <fields.length ; i++) {
        System.out.println("public"+fields[i]);
    }
    //能获得私有属性
    Field[] declaredFields = clazz.getDeclaredFields();
    for (int i = 0; i <declaredFields.length ; i++) {
        System.out.println("privateAndPublic"+declaredFields[i]);
    }
    //获得本类和父类所有的public方法
    Method[] methods = clazz.getMethods();
    for (int i = 0; i <methods.length ; i++) {
        System.out.println("public"+methods[i]);
    }
    //获得本类和父类所有的私有方法
    Method[] declaredMethods = clazz.getDeclaredMethods();
    for (int i = 0; i <declaredMethods.length ; i++) {
        System.out.println("privateAndPublic"+declaredMethods[i]);
    }
    //获得构造器
    Constructor[] constructors = clazz.getConstructors();
    for (int i = 0; i <constructors.length ; i++) {
        System.out.println(constructors[i]);
    }
    //获得所有的构造器
    Constructor[] declaredConstructors = clazz.getDeclaredConstructors();
    //获得指定的构造器
    Constructor declaredConstructor = clazz.getDeclaredConstructor(String.class, String.class);

    System.out.println("指定"+declaredConstructor);








   //动态的创建对象,利用反射创建一个对象
    Person person1 = (Person) clazz.newInstance();
    System.out.println("创建无参构造器对象"+person1.toString());
    //创建对象后可以通过反射获得方法/属性然后传入值
    //获得指定方法
    Method setName = clazz.getDeclaredMethod("setName", String.class);
    setName.invoke(person1,"陈康你真帅");
    System.out.println("方法传值"+person1);
    //获得指定属性
    Field age=clazz.getDeclaredField("age");
    age.setAccessible(true);//关闭访问权限检查,让私有方法可达,不然无法访问,并且提高反射效率,用反射,可以打开
    age.set(person1,"陈康永远18岁");
    System.out.println("属性传值"+person1);
    //通过构造器创建对象
    Person chenkang = (Person)declaredConstructor.newInstance("chenkang", "18");
    System.out.println("通过有参构造创建对象"+chenkang.toString());



    //获得类加载器ApplicationClassLoader
    ClassLoader classLoader = clazz.getClassLoader();
    System.out.println("类加载器ApplicationClassLoader"+classLoader);
    //ApplicationClassLoader
    ClassLoader parent = classLoader.getParent();
    System.out.println("扩展类加载器ApplicationClassLoader"+parent);
    //bootstrapClassLoader,根加载器获得为null
    ClassLoader parent1 = parent.getParent();
    System.out.println("根加载器bootstrapClassLoader"+parent1);
    //jdk是bootstrap加载的
    Class clazzObject = Class.forName("java.lang.Object");
    System.out.printf("bootStrap"+clazzObject.getClassLoader());
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值