关于注解和反射

news/2024/5/19 2:44:07 标签: 反射, java, class
class="baidu_pl">
class="article_content clearfix">
class="markdown_views prism-atom-one-dark">

注解

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

元注解
@Target (value = ElementType.Method) 表示注解可以用在哪些地方
@Retention(value=RetenionPolicy.RUNTIME) 在什么地方有效
@Documented 是否生成class="tags" href="/tags/JAVA.html" title=java>javadoc中
@Interited 继承

自定义注解

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

class="tags" href="/tags/FanShe.html" title=反射>反射

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

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

主要API:
class="tags" href="/tags/JAVA.html" title=java>java.lang.Class:一个类
reflect.method 代表类的方法
reflect.Field 成员变量
reflect.Constructor 类的构造器

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

Class本身也是一个类,
一个class="tags" href="/tags/JAVA.html" title=java>java的类在jvm只有一个class实例

获取class的实例

1.Class clazz = Person.class

2 Class clazz = person.getClass()

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

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

class="tags" href="/tags/FanShe.html" title=反射>反射测试代码:
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 class="tags" href="/tags/JAVA.html" title=java>java.lang.reflect.Constructor;
import class="tags" href="/tags/JAVA.html" title=java>java.lang.reflect.Field;
import class="tags" href="/tags/JAVA.html" title=java>java.lang.reflect.InvocationTargetException;
import class="tags" href="/tags/JAVA.html" title=java>java.lang.reflect.Method;

public class reflection {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchFieldException {
//获得class ,就是class="tags" href="/tags/FanShe.html" title=反射>反射用的镜子
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);








   //动态的创建对象,利用class="tags" href="/tags/FanShe.html" title=反射>反射创建一个对象
    Person person1 = (Person) clazz.newInstance();
    System.out.println("创建无参构造器对象"+person1.toString());
    //创建对象后可以通过class="tags" href="/tags/FanShe.html" title=反射>反射获得方法/属性然后传入值
    //获得指定方法
    Method setName = clazz.getDeclaredMethod("setName", String.class);
    setName.invoke(person1,"陈康你真帅");
    System.out.println("方法传值"+person1);
    //获得指定属性
    Field age=clazz.getDeclaredField("age");
    age.setAccessible(true);//关闭访问权限检查,让私有方法可达,不然无法访问,并且提高class="tags" href="/tags/FanShe.html" title=反射>反射效率,用class="tags" href="/tags/FanShe.html" title=反射>反射,可以打开
    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("class="tags" href="/tags/JAVA.html" title=java>java.lang.Object");
    System.out.printf("bootStrap"+clazzObject.getClassLoader());
}

}


http://www.niftyadmin.cn/n/1332354.html

相关文章

蚂蚁金服更名,抢人升级!

最近蚂蚁金服的名字变了&#xff0c;全称已从“蚂蚁小微金融服务股份有限公司”改为“蚂蚁科技集团股份有限公司”。金服变为科技&#xff0c;浙江的区域标签也拿掉&#xff0c;凸显了数字化、全球战略的升级。这岂不意味着新一波的招聘需求&#xff1f;打开 boss 一看&#xf…

spring 创建bean的三种方式一 :xml配置

目前spring 创建bean的方式一共有3种类&#xff0c;分别是&#xff1a;xml配置&#xff0c;java配置和注解 此篇是xml配置 在resource下新建beans.xml beans.xml <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springfr…

进阶 Java 高手必须知道的 11 个优化建议

点击上方 果汁简历 &#xff0c;选择“置顶公众号”优质文章&#xff0c;第一时间送达这篇文章就是告诉你&#xff0c;如何通过消除瓶颈、缓存和一些细节调整来优化性能。大多数开发人员认为性能优化是一个复杂的话题&#xff0c;需要很多的经验积累和知识储备才能搞定&#xf…

Spring 创建bean的三种方式

测试类 package com.kang;import org.springframework.beans.factory.annotation.Value; public class People {Value("chengkangValue")private String name;public People() {}public People(String name) {this.name name;}Overridepublic String toString() {r…

讲述:一个月薪 12000 的北京程序员的真实生活

点击上方 果汁简历 &#xff0c;选择“置顶公众号”优质文章&#xff0c;第一时间送达来源&#xff1a;blog.csdn.net/qq_40433465/article/details/841967961. 关于学历2. 关于婚姻3. 关于性别4. 关于住房5. 关于吃6. 关于交通工具7. 关于爱好8. 关于性格9. 结尾“ 每个人都有…

springAOP的三种方式

aop&#xff1a;面向切面编程 一般程序都是纵向变成controller – service – respository 当我们想给service方法加个日志功能&#xff0c;但是却不能动源码时&#xff0c;就需要给其加个动态代理 aop就是在不改变原来代码的基础上&#xff0c;对方法进行增强 原理&#xff1…

花了 5 分钟就搞定了 Java 下载和解析 Excel

点击上方 果汁简历 &#xff0c;选择“置顶公众号”优质文章&#xff0c;第一时间送达工欲善其事必先利其器&#xff0c;果然有道理&#xff0c;之前经常做一些 Excel 的解析和写入&#xff0c;大家估计也对 jxl 和 poi 有所耳闻&#xff0c;操作起来那是一塌糊涂&#xff0c;需…

SparkSQL 基本可以取代 hive 了!

Apache Spark 社区是全球最大的开源社区。而借由快速、易于使用的特点&#xff0c;Spark 成为时下最流行的分布式内存大数据处理引擎&#xff0c;可以帮助解决各种复杂的数据问题&#xff0c;无论是半结构化、结构化、流式&#xff0c;或机器学习、数据科学。而作为一名国内的 …