枚举,注解,反射

🌟枚举的方法 Enum抽象类常见方法
在这里插入图片描述
🌟枚举接口
在这里插入图片描述
🌟枚举的注意事项
在这里插入图片描述
🌟注解
注释是标注给人看的,注解是标注给机器看的,可以嵌入到字节码中,Java虚拟机可以保留标注内容,注解可以被执行。注解可以应用在Java语言中的类、方法、变量、参数和包等。
注解可以非常方便的生成代码之间的依赖关系。

✨内置注解:用框架时候用得多
常用内置注解:(可以放在类、方法、变量、参数等前)
@Override:重写
@Deprecated :废弃 (注解完再定义一个新的方法)
@FunctionalInterface:函数式接口
@SuppressWarnings:抑制编译时的警告信息

🌟自定义注解:与接口用法一样
元注解:
在这里插入图片描述
✨自定义注解格式:
@interface 自定义注解名{}
✨注解类型
@interface
@Documented
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)

———————————————————————————————————————————————————

🌟反射
Java 的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法(包括私有方法和已经封装的方法),可以调用任意一个对象的属性和方法(去年写的再运行的情况下可以被添加和使用)。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键。

🌟类加载器
Java类加载器(Java Classloader)是Java运行时环境(Java Runtime Environment)的一部分,负责动态加载Java类到Java虚拟机的内存空间中。
Java默认有三种类加载器:
BootstrapClassLoader(引导启动类加载器)—>ExtensionClassLoader(扩展类加载器)—>App ClassLoader(应用类加载器),父类加载器按层级向下委派是否加载类的指令

🌟类加载器:
✨获取到Class的三种方式:
⚠️常用:第三种方式可以用在类还不存在的时候提前使用,其他形式在类不存在时会出错
在这里插入图片描述

🌟反射中的构造方法:
✨通过一个类对象,获取一个类的构造方法
1.通过指定的参数类型,获取指定的单个构造方法
getConstuctor(参数类型class对象数组)
例如:
构造方法如下:Person(String name, int age)
得到这个构造方法的代码如下:
Constructor c = p.getClass().getConstructor(String.class, int.class);

2.获取构造方法数组
getConstructors();
3.获取所有权限的单个构造方法
getDeclaredConstructor(参数类型的class对象数组)
4.获取所有权限的构造方法数组
getDeclaredConstructors();

🌟 Constructor 创建对象
常用方法:
newInstance(Object…para)
参数:是一个Object类型可变参数,传递的参数顺序 必须匹配构造方法中形成参数列表的顺序!

setAccessible(boolean flag)
如果flag为 true 则表示忽略访问权限检查!(可以访问任何权限的方法)

代码示例:

public class Demo4_1 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
		//获取此文件,使用泛型类型需强转
        Class<Person> pClass = (Class<Person>)Class.forName(“demo4.Person”);
        //找到无参构造方法
        Constructor<Person> c1 = pClass.getConstructor();
        //使用无参构造方法,创建对象
        Person p = c1.newInstance();
        System.out.println(p);

        //找到包含String name 和 int age的构造方法
        Constructor<Person> c2 = pClass.getConstructor(String.class,int.class);
        //或者写成 Constructor c = pClass.getConstructor(new Class[]{String.class,int.class});

        //使用这个构造方法,创建对象
        Person p2 = c2.newInstance("张三",18);
        System.out.println(p2);

        //通过反射技术,在外部调用私有构造方法
        Constructor<Person> c3 = pClass.getDeclaredConstructor(String.class);//获取私有构造方法必须通过getDeclaredConstructor来调用
        c3.setAccessible(true);//忽略权限的检查,没有这句话会报错无法获取私有
        Person p3 =c3.newInstance("李四");//创建一个对象 李四
    }
}

🌟通过Class对象 获取一个类的 方法
1.getMethod(String methodName, class…class)
根据参数裂变的类型和方法名,得到一个方法(public修饰的)
2.getMethods();
得到一个类的所有方法(public修饰的)
3.getDeclaredMethod(String methodName, class…class)
根据参数列表的类型和方法名,得到一个方法(除继承以外所有的:包括私有,共有,保护,默认)
4.getDeclaredMethods();
得到一个类的所有方法(除继承以外所有的:包括私有,共有,保护,默认)

✨Method 执行方法
invoke(Object o,Object…para)
调用方法:
参数1.要调用方法的对象
参数2.要传递的参数列表

2.getName()
获取方法的 方法名称

3.setAccessible(boolean flag)
如果flag 为 true 则表示忽略访问权限检查!(可以访问任何权限的方法)

代码示例:
面向未来编程(当前如果不存在Person类代码不会出错,后面把Person类补进来就好)

public class method {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        //加载类
        Class c1 = Class.forName("demo4.Person");
        //获取类的构造方法
        Constructor c = c1.getConstructor();
        //创建了对象
        Object o = c.newInstance();
        //获取类的方法/setAge是一个私有方法
        Method setName = c1.getMethod("setName",String.class);
        Method setAge = c1.getDeclaredMethod("setAge",int.class);//要用getDeclaredMethod获取私有方法
        setAge.setAccessible(true);//忽略权限检查
        /*执行这个方法
        * 参数1.哪个对象要执行setName方法
        * 参数2.调用方法时传递的参数 0-n个 (可变参数列表)*/
        setName.invoke(o,"李四");
        setAge.invoke(o,18);
        System.out.println(o);
    }
}

🌟获取Field
✨通过class对象 获取一个类的属性
1.getDeclaredField(String filedName)
根据属性的名称,获取一个属性对象(所有属性)
2.getDEclaredFields();
获取所有属性
3.getField(String filedName)
根据属性的名称,获取一个属性对象(public属性)
4.getFields()
获取所有属性(public)

✨Field属性的对象类型
常用方法:
1.get(Object o);
参数:要获取属性的对象
获取指定对象的词属性值
2.set(Object o,Object value);
参数1.要设置属性值的 对象
参数2.要设置的值
设置指定对象的属性值

3.getName()
获取属性的名称

4.setAccessible(boolean flag)
如果flag 为 true 则表示忽略访问权限检查!(可以访问任何权限的的属性)
代码示例:
在这里插入图片描述

🌟反射与注解
如何通过Class 获取注解
ORM框架:对象 关系 映射
将一个类很快速的映射到数据库里
模仿ORM中的主解:

✨获取类/属性/方法的全部注解对象

Annotation[] annotations01 = Class/Field/Method.getAnnotations();
for (Annotation annotation : annotations01) {
    System.out.println(annotation);
}

✨根据类型获取类/属性/方法的注解对象

注解类型 对象名 = (注解类型) c.getAnnotation(注解类型.class);
在这里插入图片描述

🌟内省
基于反射,java所提供的一套应用到JavaBean的API,获取所有get()set()方法
在这里插入图片描述

1.Introspector
获取Bean类信息
方法:
BeanInfo getBeanInfo(Class cls)
通过传入的类信息,得到这个Bean类的封装对象

2.BeanInfo
常用的方法:
MethodDescriptor[] getPropertyDescriptors();
获取bean类的 get/set方法 数组

3.MethodDescriptor
常用方法:
1.Method getReadMethod();
获取一个get方法
2.Method getWriteMethod();
获取一个set方法
有可能返回null,注意,加判断!
在这里插入图片描述
⚠️如果是私有变量为布尔类型,获取的get()方法是is…();
如:setFlag(boolean); isFlag();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值