@Override:(重写)定义在java.lang.Override中,此注解只可以标记在方法上,表示重写父类的方法
@Deprecated:(过时)定义在java.lang.Deprecated中,此注解可以修饰方法、属性、类,表示不推荐程序员使用,通常因为被标记类使用有危险或者有更好的替代方法
@SuppressWarnings:(压制警告)定义在java.lang.SuppressWarnings中,此注解用来压制编译时出现的警告信息,需要在使用时加上参数@SuppressWarnings(“参数”)
@Target:标识注解可以在哪里使用,具体类型可以参考枚举类ElementType
@Documented:标识生成javadoc文档
@Retention:标识注解生效级别,具体类型可以参考RetentionPolicy,RUNTIME>CLASS>SOURCE
@Inherited:标识子类可以继承父类的该注解
@Target({ElementType.FIELD,ElementType.METHOD}) //标记可以使用的地方,字段、方法
@Retention(RetentionPolicy.RUNTIME) //标记生效级别,运行时
@Documented //javadoc
public @interface AnnotationTest{}
@Target({ElementType.FIELD,ElementType.METHOD}) //标记可以使用的地方,字段、方法
@Retention(RetentionPolicy.RUNTIME) //标记生效级别,运行时
@Documented //javadoc
public @interface AnnotationTest{
String value();//如果只有一个参数时使用value,在使用注解时可以省略"value="
}
//@AnnotationTest("参数")
@Target({ElementType.FIELD,ElementType.METHOD}) //标记可以使用的地方,字段、方法
@Retention(RetentionPolicy.RUNTIME) //标记生效级别,运行时
@Documented //javadoc
public @interface AnnotaionTest{
String name() default "names";//设置了默认值在使用注解时可以不加该参数,直接使用默认值
}
//@AnnotationTest()
Class classs = Class.forName("com.test.Test");
Class classs = Test.class;
Test test = new Test();
Class classs = test.getClass();
Class classs = Integer.TYPE;
public static void main(String[] args) {
Class c1 = Object.class; //对象
Class c2 = int [].class; //数组
Class c3 = int [] [].class;
Class c4 = Override.class;//注解
Class c5 = ElementType.class;//枚举
Class c6 = void.class;//空
Class c7 = Connection.class;//接口
Class c8 = Class.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);
//返回发现hashCode值相等,说明只要类型和维度相同,那么就是同一个Class
//如果一维数组和二维数组,那么就不是同一个Class
int [] arr = new int[]{1};
int [] arrs = new int[]{1,2,3};
System.out.println(arr.getClass().hashCode()+" "+arrs.getClass().hashCode());
}
public static void main(String[] args) {
ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();//系统加载器 sun.misc.Launcher$AppClassLoader@18b4aac2
System.out.println(systemClassLoader);
ClassLoader parent = systemClassLoader.getParent();//扩展类加载器 sun.misc.Launcher$ExtClassLoader@5ce65a89
System.out.println(parent);
ClassLoader parent1 = parent.getParent();//引导类加载器 null
System.out.println(parent1);
Class c1 = RedisConnectionTest.class;
ClassLoader classLoader = c1.getClassLoader();//自定义类获取到了系统加载器 sun.misc.Launcher$AppClassLoader@18b4aac2
System.out.println(classLoader);
Class c2 = Object.class;//jdk类获取到了引导类加载器 null
System.out.println(c2.getClassLoader());
//获取类加载器可以加载的路径
String property = System.getProperty("java.class.path");
String[] split = property.split(";");
Arrays.asList(split).forEach(s-> System.out.println(s));
}
public static void main(String[] args) throws Exception {
//通过反射获取Class
Class classs = Class.forName("com.test.demolearning.user.entity.User");
//获取属性
Field[] fields = classs.getFields();//getFields只能获取public修饰的属性
Arrays.asList(fields).forEach(field -> System.out.println("getFields: "+field));
//classs.getField("属性名");获取public修饰的指定属性名
Field[] declaredFields = classs.getDeclaredFields();//getDeclaredFields可以获取所有的属性
Arrays.asList(declaredFields).forEach(declaredField -> System.out.println("getDeclaredFields: "+declaredField));
//classs.getDeclaredField("");获取指定属性名,不受修饰符控制
Method[] methods = classs.getMethods();//获取本类public修饰的方法及父类public修饰的方法
Arrays.asList(methods).forEach(method -> System.out.println("getMethods: "+method));
//classs.getMethod("");获取指定public修饰的方法名,包含父类。可以获取set方法,值可以追加参数类型,classs.getMethod("",属性类型.class)
Method[] declaredMethods = classs.getDeclaredMethods();//获取本类所有方法,不受修饰符控制,无法获取父类方法
Arrays.asList(declaredMethods).forEach(declaredMethod -> System.out.println("declaredMethod: "+declaredMethod));
//classs.getDeclaredMethod("");获取所有方法中指定的方法,不包含父类。获取set和method类似
Constructor[] constructors = classs.getConstructors();//获取public的构造方法
Arrays.asList(constructors).forEach(constructor -> System.out.println("constructor: "+constructor));
//Constructor constructor = classs.getConstructor(String.class, int.class);//获取指定类型的public有参构造
Constructor[] declaredConstructors = classs.getDeclaredConstructors();//获取所有的构造方法
Arrays.asList(declaredConstructors).forEach(declaredConstructor -> System.out.println("declaredConstructor: "+declaredConstructor));
//Constructor declaredConstructor = classs.getDeclaredConstructor(String.class);获取指定类型有参构造,包含私有
}
public static void main(String[] args) throws Exception{
Class c1 = Class.forName("com.test.demolearning.user.entity.User");
User user = (User)c1.newInstance();//反射获取实例,如果没有无参构造将报错。可以使用c1.getConstructor(String.class)这类方法找到对应有参构造然后调用newInstance获取实例
System.out.println(user);
Method setName = c1.getMethod("setName", String.class);//获取方法
setName.invoke(user,"纳米");//执行方法
System.out.println(user);
Field name = c1.getDeclaredField("id");//获取字段
name.setAccessible(true);//由于是private修饰,所以需要关闭安全检查开关,可提高反射效率
name.set(user,"ids");
System.out.println(user);
}
public static void main(String [] args) throws Exception{
Class c1 = User1.class;
Method method = c1.getMethod("test", Map.class, String.class);
Type[] genericParameterTypes = method.getGenericParameterTypes();//获取泛型参数类型
int count = 1;
for (Type genericParameterType : genericParameterTypes) {//获取所有参数类型进行循环
System.out.println("最外层" +count+"有: "+ genericParameterType);
if(genericParameterType instanceof ParameterizedType){//判断如果参数是泛型参数化类型就再往里面取
//强转参数化类型,getActualTypeArguments获取真实参数方法
Type[] actualTypeArguments = ((ParameterizedType) genericParameterType).getActualTypeArguments();
for (Type actualTypeArgument : actualTypeArguments) {
System.out.println("最外层"+count+"的内层有: "+actualTypeArgument);
}
}
count++;
}
Method methodGet = c1.getMethod("test1");
Type genericReturnType = methodGet.getGenericReturnType();//获取泛型返回型类型
if(genericReturnType instanceof ParameterizedType){//判断如果是参数化类型
System.out.println(genericReturnType);
//强转为参数化类型并获取真是类型
Type[] actualTypeArguments = ((ParameterizedType) genericReturnType).getActualTypeArguments();
for (Type actualTypeArgument : actualTypeArguments) {
System.out.println(actualTypeArgument);
}
}
}
class User1{
public void test(Map<String,Integer> map,String string){
}
public Map<String,Integer> test1(){
return null;
}
}
@Tests.ClassAnnotation
class TestAnnotations{
private String name;
private Integer age;
@Tests.FieldAnnotation("sex1")
private Integer sex;
public TestAnnotations(){}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Integer getSex() {
return sex;
}
public void setSex(Integer sex) {
this.sex = sex;
}
}
--------------------------------------------------------------------------------------
public static void main(String[] args) throws Exception {
Map<String,String> datas = new HashMap<>();
datas.put("sex1","男");
datas.put("sex2","女");
Class classs = TestAnnotations.class;
TestAnnotations testAnnotations = new TestAnnotations();
testAnnotations.setName("names");
testAnnotations.setAge(18);
testAnnotations.setSex(1);
ClassAnnotation annotation = (ClassAnnotation)classs.getAnnotation(ClassAnnotation.class);//获取类上注解
if(annotation==null){
System.out.println("没有类注解");
return;
}
Map<String,Object> map = new HashMap<>();
Field[] fields = classs.getDeclaredFields();
for (Field field : fields) {
PropertyDescriptor propertyDescriptor = BeanUtils.getPropertyDescriptor(classs, field.getName());//通过这个方法可以获取到每个属性
Object invoke = propertyDescriptor.getReadMethod().invoke(testAnnotations);//通过属性找到它的get方法并执行,获取到对象的值
map.put(field.getName(),invoke);//将源对象值put到map集合中
FieldAnnotation fieldAnnotation = (FieldAnnotation)field.getAnnotation(FieldAnnotation.class);//获取字段上注解
if(fieldAnnotation==null){
continue;
}
String value = fieldAnnotation.value();//获取到字段注解都value值
String s = datas.get(value);//返回性别
map.put(field.getName()+fieldAnnotation.sexText(),s);
}
System.out.println(map);
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@interface ClassAnnotation{
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@interface FieldAnnotation{
String value();
String sexText() default "_text";
}