🌟枚举的方法 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();