Java基础(十一) ---- 反射

本文详细介绍了Java反射API的使用,包括如何通过Class对象获取类的信息、实例化对象、调用方法和设置字段,以及注解的使用,如内置注解和自定义注解的定义与应用。
摘要由CSDN通过智能技术生成

含义

基本方法

Class<User> clazz = User.class      //通过类的.class文件获取到Class对象
clazz.getName()                     //类的全限定名
clazz.getSimpleName()               //类的名字
clazz.getSuperclass()               //类的父类
clazz.getInterfaces()               //类实现的接口
clazz.getFields()                   //类的字段(public修饰的属性,不包含继承)
clazz.getDeclaredFields()           //类的字段(类中定义的所有属性,不包含继承)
field.getType()                     //字段的类型 属性类型
field.getName()                     //字段名 属性名
field.set(obj,value)                //对已有对象的该属性进行赋值
clazz.getMethods()                  //类的方法(public修饰的方法,包含继承)
clazz.getDeclaredMethods()          //类的方法(类中定义的所有方法,不包含继承)
method.getName()                    //方法名
method.getReturnType()              //方法返回类型
method.getTypeParameters()          //方法参数列表
clazz.getConstructors()             //类的构造方法(public修饰的属性,不包含继承)
clazz.getDeclaredConstructors()     //类的构造方法(类中定义的所有属性,不包含继承)
clazz.getPackage()                  //类所在的包

使用反射实例化

User user = new User("xxx","123");
​
User user = new User();
user.setUsername("xxx");
user.setPassword("123");
​
Class<User> clazz = User.class;
User user = clazz.newInstance();
Method setUsername = clazz.getMethod("setUsername",String.class);
setUsername.invoke(user,"xxx");
Method.setPassword = clazz.getMethod("setPassword",String.class);
setPassword.invoke(user,"123");
​
Class<User> clazz = User.class;
User user = clazz.newInstance();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
 String methodName = "set"+field.getName().substring(0,1).toUpperCase()+name.substring(1);
 Class<?> methodType = field.getType();
 clazz.getMethod(methodName, methodType).invoke(user,"xxx");
}
​
Class<User> clazz = User.class;
User user = clazz.newInstance();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
 field.setAccessible(true);
 field.set(user,"xxx");
}

注解

含义:Annotation是从JDK1.5开始引入的新技术,注解即可以对程序员解释又可以对程序解释

注解 vs 注解

注释:对程序员解释代码信息

注解:对程序和程序员解释代码信息

内置注解

@Override:重写

@Deprecated:

@SuppressWarnings:all、unchecked、deprecation等

元注解

@Target:用于描述注解的适用范围

@Retention:注解的生命周期

@Document:该注解将包含在javadoc文档中

@Inherited:子类可继承父类该注解

自定义注解

Class<Teacher> clazz = Teacher.class;
Teacher tch = clazz.newInstance();
Field[] declaredFields = clazz.getDeclaredFields();
for (Field field : declaredFields) {
 Value value = field.getAnnotation(Value.class);
 if (value != null){
     String v = value.value();
     if ("".equals(v)) throw new RuntimeException();
     field.setAccessible(true);
     Class<?> type = field.getType();
     if (type == String.class) field.set(tch,v);
     else if (type.isPrimitive()){
         if (type == int.class || type == Integer.class)        
             field.set(tch,Integer.parseInt(v));
         else if (type == byte.class || type == Byte.class)     
             field.set(tch,Byte.parseByte(v));
         else if (type == short.class || type == Short.class) 
             field.set(tch,Short.parseShort(v));
         else if (type == long.class || type == Long.class) 
             field.set(tch,Long.parseLong(v));
         else if (type == float.class || type == Float.class) 
             field.set(tch,Float.parseFloat(v));
         else if (type == double.class || type == Double.class) 
             field.set(tch,Double.parseDouble(v));
         else if (type == boolean.class || type == Boolean.class) 
             field.set(tch,Boolean.parseBoolean(v));
         else if (type == char.class || type == Character.class) 
             field.set(tch,v.charAt(0));
     }
 }
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Value {
     String value() default "";
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值