5.java 反射与注解(Annotation)

1.内置注解

(1)@注解名

(2)常见内置注解

@Override//重写父类,接口方法

2.自定义注解

(1)@Interface + 注解名可以自定义一个注解

(2)@Target(Element.METHOD)//表示该注解可用在什么地方,Element的枚举变量有类(Element.TYPE),方法,源代码。。。

(3)@Retention(RetentionPolicy.RUNTIME)//表示注解在什么地方有效,比如运行时

@Interface myAnnotation{

        //注解参数-----参数类型+参数名()

        String name() default "";//default ""------默认值“”

        int old();

}

3.反射(Reflection)

(1)每个类加载在虚拟机中,只有一个Class类的对象

(2)Class类的对象可以知道类的所有构造

(3)获取Class类的对象获取三种方法

           Class c1 = 类名.class

           Class c2 = Class.forName("com.source.user")//类的package路径

           Class c3 = new 类目().getClass();

(4)Class类对象方法

Class c1 = 类名.class

Class c2 = c1.getSupperClass()//获得父类的Class对象

System.out.println(c1.getName());//获得包名+类名

System.out.println(c1.getSimpleName());//获得类名

Field[] fields = c1.getFields();//获得所有public属性

Field[] fields1 =  c1.getDeclaredFields();//获得所有属性

foreach(Field field :fields){

        System.out.println(fields );//获得类名

}

Method[] method = c1.getMethods()//获得public方法

Method[] method1= c1.getDeclaredMethods()//获得所有方法

Constructor[] constructors = c1.getConstructors()//获得public构造器

Constructor[] constructors1 = c1.getDeclaredConstructors()//获得所有构造器

//以上都可以获得指定的方法,属性,构造器

c1.getDeclaredMethod()---getDeclaredField()----c1.getDeclaredConstructor()

参数也要用class类对象

int --Int.class

String ---String.class

..........................

(5)class类对象运用

【1】获取新的对象

package com.text.User

//实体类(不全,懒得写)

class User{

private String name;

private int old;

        public User(){}

        public User(String name, int old){

                this.name = name;

                this.old = old;

        }

public String getName(){return this.name;}

public void setName(String name){this.name = name;}

public int getold(){return this.old;}

public void setold(int old){this.old = old;}

}

Class c1 = Class.forName("com.text.User ");

User user = (User)c1.newInstance();//获得一个无参构造方法的类的对象

//获得有参构造器再获取对象

ConStructor cs = c1.getDeclaredConstructor(String.class, Int.class );

User user = (User)cs.newInstance("张三",666);

 //获得方法

Method md = c1.getDeclaredMethod("setName", String.class);

md.invoke(user, "老王")

System.out.println(c1.getName());//老王

//获得属性

Field field = c1.getDeclaredField("old");

c1.setAccessible(true)//old是私有的,关闭程序的安全检测

field.set(user, 18);

System.out.println(c1.getOld());//18

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值