
@Target(value=METHOD)
@Retention(value=SOURCE)
public @interface Override
表示一个方法声明的目的是覆盖父类方法声明。如果一个方法是注释,该注释类型的编译器是除非下列条件中的至少一个保持需要产生一个错误信息:
@Documented
@Retention(value=RUNTIME)
@Target(value={CONSTRUCTOR,FIELD,LOCAL_VARIABLE,METHOD,PACKAGE,PARAMETER,TYPE})
public @interface 已过时的
一个程序单元注释”不是一个程序员应该使用,通常是因为它是危险的,因为一个更好的选择的存在。编译器警告当一个过时的程序元素的使用或重写非过时的代码。
@Target(value={TYPE,FIELD,METHOD,PARAMETER,CONSTRUCTOR,LOCAL_VARIABLE})
@Retention(value=SOURCE)
public @interface SuppressWarnings
指示在注释元素(和包含在注释元素中的所有程序元素中)应被抑制命名的编译器警告。注意,警告在给定元素抑制是警告抑制所有包含元素的一个超集。例如,如果您对一个类进行注释以抑制一个警告和注释一个抑制另一个警告的方法,这两个警告将被抑制在该方法中。
作为一个风格的问题,程序员应该总是使用这个注释对最深嵌套的元素,它是有效的。如果你想在一个特定的方法中抑制警告,你应该注释该方法,而不是它的类。
Target
@Documented
@Retention(value=RUNTIME)
@Target(value=ANNOTATION_TYPE)
public @interface Target
指示注释类型适用的上下文。的声明上下文和语境中注释类型可以适用在JLS 9.6.4.1指定,并由
java.lang.annotation.ElementType
枚举常量的源代码表示。
如果一个@Target元注释在注释类型T是不存在的,然后T型注释可以写成一个除了类型参数声明的任何声明修饰符。
如果一个@Target元注释时,编译器将强制使用限制的ElementType枚举常数表示,与JLS 9.7.4线。
例如,这@Target元注释表明声明的类型本身是一元注释类型。它只能用于注释类型声明:
“目标(ElementType。annotation_type)接口metaannotationtype {…}
这@Target元注释表明声明的类型是专为使用在复杂的注释类型声明的成员类型。它不能用来直接注释任何东西:
@目标({ })接口成员类型{…}
这是一个编译时错误一ElementType常出现超过一次在@Target注释。例如,下面的@Target元注释是非法的:
“目标({ elementtype.field,elementtype.method,ElementType。场})公开@接口虚假…}
Retention
@Documented
@Retention(value=RUNTIME)
@Target(value=ANNOTATION_TYPE)
public @interface Retention
表示要保留带注释类型的注释的多长时间。如果没有保留注释在注释类型声明,保留策略默认
RetentionPolicy.CLASS
保留元注释只有当元注释类型被直接用于注释时才有效果。如果在另一个注释类型中使用元注释类型作为成员类型,则不会有任何效果。
Docmented
@Documented
@Retention(value=RUNTIME)
@Target(value=ANNOTATION_TYPE)
public @interface Documented
表明一个类型的注释被javadoc默认文件。此类型应用于注释注释的类型的声明,它们的注释会影响它们的客户端使用注释元素的使用。如果一个类型声明是有文档说明的,它的注释将成为注释元素的公共的接口的一部分。
Inherited
@Documented
@Retention(value=RUNTIME)
@Target(value=ANNOTATION_TYPE)
public @interface Inherited
表示一个注释类型是自动继承的。如果一个继承元注释是目前注释类型声明,以及用户查询类声明的注释类型和类的声明没有注释这种类型,那么类的父类将自动查询注释类型。此过程将被重复,直到找到该类型的注释,或达到类层次结构的顶部(对象)。如果没有父类具有这种类型的注释,然后查询将显示该类问题没有这样的注释。
请注意,如果使用带注释的类型用于注释一个类以外的任何其他类,则此元注释类型不会有任何效果。注意,这只是原因元注释注释可以从父类继承;对实现的接口注释没有影响。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U0HNrQyO-1651388014623)(../../图片/typora/1651367664827.png)]](https://img-blog.csdnimg.cn/7cc35533bf3044dcacb746ec323c339e.png)
@interface MyAnnotation{ }
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uV2XfE9v-1651388014624)(../../图片/typora/1651367952247.png)]](https://img-blog.csdnimg.cn/17949e662ef8420b97eeebf8d6b42cf8.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TbUyvTof-1651388014625)(../../图片/typora/1651368366085.png)]](https://img-blog.csdnimg.cn/596f744c70cd4174be20aad76482efdc.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O0EW8MBr-1651388014625)(../../图片/typora/1651368239493.png)]](https://img-blog.csdnimg.cn/7c75e28aa15c4242805519360bcb77ee.png)
package com.lxf.ARdemo;
public class RDemo extends Object {
public static void main(String[] args) throws ClassNotFoundException {
Class c1 = Class.forName("com.lxf.ARdemo.user");
Class c2 = Class.forName("com.lxf.ARdemo.user");
Class c3 = Class.forName("com.lxf.ARdemo.user");
Class c4 = Class.forName("com.lxf.ARdemo.user");
System.out.println(c1);
//一个类在内存只有一个对象
//一个类被加载后 类的整个结构都会被封装在class对象中
System.out.println(c2.hashCode());
System.out.println(c3.hashCode());
System.out.println(c4.hashCode());
}
}
//实体类
class user {
private String name ;
private int id ;
private int age ;
public String getName() {
return name;
}
public void setName(String name) {
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;
}
}
package com.lxf.ARdemo;
@SuppressWarnings("all")
public class RDemo extends Object {
public static void main(String[] args) throws ClassNotFoundException {
Person person = new Student() ;
System.out.println("this is person :"+person.name);
Class c1 = person.getClass();
System.out.println(c1.hashCode());
Class c2 = Class.forName("com.lxf.ARdemo.Student");
System.out.println(c2.hashCode());
Class c3 = Student.class;
System.out.println(c3.hashCode());
Class c4 = Integer.class;
System.out.println(c4);
Class c5 = c1.getSuperclass();
System.out.println(c5);
}
}
class Person {
String name ;
public Person() {
}
public Person(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person{"+"name='" + name + '\'' + "}";
}
}
class Student extends Person{
public Student() {
this.name = "学生";
}
}
class Teacher extends Person{
public Teacher() {
this.name = "老师";
}
}
package com.lxf.ARdemo;
import java.lang.annotation.ElementType;
public class Demo01 {
public static void main(String[] args) {
Class c1 = Object.class;
Class c2 = Comparable.class;
Class c3 = String[].class;
Class c4 = int[][].class;
Class c5 = Override.class;
Class c6 = ElementType.class;
Class c7 = Integer.class;
Class c8 = void.class;
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);
int a[] = new int[10];
int b[][] = new int[10][10];
System.out.println(a.getClass().hashCode());
System.out.println(b.getClass().hashCode());
}
}
输出:
class java.lang.Object
interface java.lang.Comparable
class [Ljava.lang.String;
class [[I
interface java.lang.Override
class java.lang.annotation.ElementType
class java.lang.Integer
void
class java.lang.Class
1956725890
356573597
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aNYJ8dqD-1651388014626)(../../图片/typora/1651373211044.png)]](https://img-blog.csdnimg.cn/426531b0dc9e4371bc96b9392a9e7574.png)
package com.lxf.ARdemo;
public class TDemo04 {
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 aClass = Class.forName("com.lxf.ARdemo.TDemo04").getClassLoader();
System.out.println(aClass);
//JDK内置类加载
aClass = Class.forName("java.lang.Object").getClassLoader();
System.out.println(aClass);
//系统类加载器可以加载的路径
System.out.println(System.getProperty("java.class.path"));
/**
* E:\program\JAVA\jdk1.8.0_321\jre\lib\charsets.jar;
* E:\program\JAVA\jdk1.8.0_321\jre\lib\deploy.jar;
* E:\program\JAVA\jdk1.8.0_321\jre\lib\ext\access-bridge-64.jar;
* E:\program\JAVA\jdk1.8.0_321\jre\lib\ext\cldrdata.jar;
* E:\program\JAVA\jdk1.8.0_321\jre\lib\ext\dnsns.jar;
* E:\program\JAVA\jdk1.8.0_321\jre\lib\ext\jaccess.jar;
* E:\program\JAVA\jdk1.8.0_321\jre\lib\ext\jfxrt.jar;
* E:\program\JAVA\jdk1.8.0_321\jre\lib\ext\localedata.jar;
* E:\program\JAVA\jdk1.8.0_321\jre\lib\ext\nashorn.jar;
* E:\program\JAVA\jdk1.8.0_321\jre\lib\ext\sunec.jar;
* E:\program\JAVA\jdk1.8.0_321\jre\lib\ext\sunjce_provider.jar;
* E:\program\JAVA\jdk1.8.0_321\jre\lib\ext\sunmscapi.jar;
* E:\program\JAVA\jdk1.8.0_321\jre\lib\ext\sunpkcs11.jar;
* E:\program\JAVA\jdk1.8.0_321\jre\lib\ext\zipfs.jar;
* E:\program\JAVA\jdk1.8.0_321\jre\lib\javaws.jar;
* E:\program\JAVA\jdk1.8.0_321\jre\lib\jce.jar;
* E:\program\JAVA\jdk1.8.0_321\jre\lib\jfr.jar;
* E:\program\JAVA\jdk1.8.0_321\jre\lib\jfxswt.jar;
* E:\program\JAVA\jdk1.8.0_321\jre\lib\jsse.jar;
* E:\program\JAVA\jdk1.8.0_321\jre\lib\management-agent.jar;
* E:\program\JAVA\jdk1.8.0_321\jre\lib\plugin.jar;
* E:\program\JAVA\jdk1.8.0_321\jre\lib\resources.jar;
* E:\program\JAVA\jdk1.8.0_321\jre\lib\rt.jar;
* E:\log\vs\javasegui\out\production\javasegui;
* E:\log\vs\javasegui\src\com\lib\commons-io-2.11.0.jar;
* E:\program\IntelliJ IDEA Community Edition 2021.3.3\lib\idea_rt.
* 双亲委派机制
*/
}
}
输出:
sun.misc.Launcher$AppClassLoader@18b4aac2
sun.misc.Launcher$ExtClassLoader@74a14482
null
sun.misc.Launcher$AppClassLoader@18b4aac2
null
E……
进程已结束,退出代码0
package com.lxf.ARdemo;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class TDemo05 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException {
Class c1 = Class.forName("com.lxf.ARdemo.User");
User user = new User();
c1 = user.getClass();
System.out.println(c1.getName());
System.out.println(c1.getSimpleName());
System.out.println("===========================");
Field[] fields = c1.getFields();
for (Field field : fields) {
System.out.println(field);
}
fields = c1.getDeclaredFields();
for (Field field : fields) {
System.out.println(field);
}
Field name = c1.getDeclaredField("name");
System.out.println(name);
System.out.println("===========================");
Method[] methods = c1.getMethods();//本类、父类的方法
for (Method method : methods) {
System.out.println("正常的"+method);
}
methods = c1.getDeclaredMethods();//本类方法
for (Method method : methods) {
System.out.println("dec的"+method);
}
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();
for (Constructor constructor : constructors) {
System.out.println(constructor);
}
constructors = c1.getDeclaredConstructors();
for (Constructor constructor : constructors) {
System.out.println("#"+constructor);
}
System.out.println("===========================");
Constructor constructors1 = c1.getConstructor(String.class,int.class,int.class);
System.out.println("指定"+constructors1);
}
}
输出:
com.lxf.ARdemo.User
User
===========================
private java.lang.String com.lxf.ARdemo.User.name
private int com.lxf.ARdemo.User.id
private int com.lxf.ARdemo.User.age
private java.lang.String com.lxf.ARdemo.User.name
===========================
正常的public java.lang.String com.lxf.ARdemo.User.getName()
正常的public int com.lxf.ARdemo.User.getId()
正常的public void com.lxf.ARdemo.User.setName(java.lang.String)
正常的public void com.lxf.ARdemo.User.setId(int)
正常的public int com.lxf.ARdemo.User.getAge()
正常的public void com.lxf.ARdemo.User.setAge(int)
正常的public final void java.lang.Object.wait() throws java.lang.InterruptedException
正常的public final void java.lang.Object.wait(long,int) 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 java.lang.String java.lang.Object.toString()
正常的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()
dec的public java.lang.String com.lxf.ARdemo.User.getName()
dec的public int com.lxf.ARdemo.User.getId()
dec的public void com.lxf.ARdemo.User.setName(java.lang.String)
dec的private void com.lxf.ARdemo.User.test()
dec的public void com.lxf.ARdemo.User.setId(int)
dec的public int com.lxf.ARdemo.User.getAge()
dec的public void com.lxf.ARdemo.User.setAge(int)
===========================
public java.lang.String com.lxf.ARdemo.User.getName()
public void com.lxf.ARdemo.User.setName(java.lang.String)
===========================
public com.lxf.ARdemo.User(java.lang.String,int,int)
public com.lxf.ARdemo.User()
#public com.lxf.ARdemo.User(java.lang.String,int,int)
#public com.lxf.ARdemo.User()
===========================
指定public com.lxf.ARdemo.User(java.lang.String,int,int)
package com.lxf.ARdemo;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
//通过反射创建对象
public class TDemo06 {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
Class c1 = Class.forName("com.lxf.ARdemo.User");
User user = (User)c1.newInstance();
System.out.println(user);
Constructor constructor = c1.getConstructor(String.class, int.class, int.class);
User user1 = (User) constructor.newInstance("lxf",001,18);
System.out.println(user1.getName());
//invoke 激活
User user3 = (User)c1.newInstance();
Method setName = c1.getDeclaredMethod("setName", String.class);
setName.invoke(user3,"lxf1");
System.out.println(user3.getName());
//关闭权限检测访问private属性
User user4 = (User)c1.newInstance();
Field name = c1.getDeclaredField("name");
name.setAccessible(true);
name.set(user4,"lxf2");
System.out.println(user4.getName());
}
}
package com.lxf.ARdemo;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class TDemo07 {
public static void main(String[] args) throws ClassNotFoundException, InvocationTargetException, IllegalAccessException, NoSuchMethodException {
test01();
test02();
test03();
}
public static void test01(){
User user = new User();
long startTime = System.currentTimeMillis();
for (int i = 0; i < 1000000000; i++) {
user.getName();
}
long endTime = System.currentTimeMillis();
System.out.println("普通执行10亿次"+(endTime-startTime)+"ms");
}
public static void test02() throws ClassNotFoundException, InvocationTargetException, IllegalAccessException, NoSuchMethodException {
User user = new User();
Class c1 =user.getClass();
Method getName = c1.getDeclaredMethod("getName", null);
long startTime = System.currentTimeMillis();
for (int i = 0; i < 1000000000; i++) {
getName.invoke(user,null);
}
long endTime = System.currentTimeMillis();
System.out.println("反射执行10亿次"+(endTime-startTime)+"ms");
}
public static void test03() throws InvocationTargetException, IllegalAccessException, ClassNotFoundException, NoSuchMethodException {
User user = new User();
Class c1 =user.getClass();
Method getName = c1.getDeclaredMethod("getName", null);
getName.setAccessible(true);
long startTime = System.currentTimeMillis();
for (int i = 0; i < 1000000000; i++) {
getName.invoke(user,null);
}
long endTime = System.currentTimeMillis();
System.out.println("关闭检测执行10亿次"+(endTime-startTime)+"ms");
}
}
输出
普通执行10亿次3ms
反射执行10亿次2105ms
反射执行10亿次1467ms
package com.lxf.ARdemo;
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 TDemo08 {
public static void test01(Map<String,User> map , List<User> list){
System.out.println("test01");
}
public Map<String,User> test02(){
System.out.println("test02");
return null;
}
public static void main(String[] args) throws NoSuchMethodException {
Method method = TDemo08.class.getMethod("test01", Map.class, List.class);
Type[] genericParameterTypes = method.getGenericParameterTypes();//获得参数泛型类型
for (Type genericParameterType : genericParameterTypes) {
System.out.println("#"+genericParameterType);
if (genericParameterType instanceof ParameterizedType){
Type[] actualTypeArguments = ((ParameterizedType) genericParameterType).getActualTypeArguments();
for (Type actualTypeArgument : actualTypeArguments) {
System.out.println(actualTypeArguments);
}
}
}
}
}
package com.lxf.ARdemo;
import java.lang.annotation.*;
import java.lang.reflect.Field;
public class TDemo09 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {
Class c1 = Class.forName("com.lxf.ARdemo.Student2");
Annotation[] annotations = c1.getAnnotations();
for (Annotation annotation : annotations) {
System.out.println(annotation);
}
Tablelxf annotation = (Tablelxf) c1.getAnnotation(Tablelxf.class);
String value = annotation.value();
System.out.println(value);
Field f = c1.getDeclaredField("id");
Fieldlxf annotation1 = f.getAnnotation(Fieldlxf.class);
System.out.println(annotation1.colimnName());
System.out.println(annotation1.type());
System.out.println(annotation1.length());
}
}
@Tablelxf("DB_student")
class Student2 {
@Fieldlxf(colimnName = "db_name",type = "varchar",length = 3 )
String name;
@Fieldlxf(colimnName = "db_age",type = "int",length = 10 )
int age;
@Fieldlxf(colimnName = "db_id",type = "int",length = 10 )
int id;
public Student2() {
}
public Student2(String name, int age, int id) {
this.name = name;
this.age = age;
this.id = id;
}
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;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Override
public String toString() {
return "Student2{" +
"name='" + name + '\'' +
", age=" + age +
", id=" + id +
'}';
}
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface Tablelxf{
String value();
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface Fieldlxf{
String colimnName();
String type();
int length();
}