Java反射整理

反射

能够分析类能力的程序称为反射!Java在运行期间,系统始终为所有的对象维护一个被称为运行时的类型标识.这个信息追踪着
每个对象所属的类.虚拟机利用运行时类型信息选择相应的方法执行(利用反射的机制),通过专门的java类访问这些信息,保存
这些信息的类叫做Class.

Class的常用方法

获得Class

c1=stu.getClass();
try {
    c2=Class.forName("com.luhao.bean.Student");
} catch (ClassNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
c3=Student.class;
c4=int.class;
c5=Integer.class;
c6=String[].class;

获得类名

//返回类的名字
System.out.println("ClassName = "+c1.getName());
System.out.println("ClassName = "+c2.getName());
System.out.println("ClassName = "+c3.getName());
System.out.println("ClassName = "+c4.getName());//int
System.out.println("ClassName = "+c5.getName());//java.lang.Integer
System.out.println("ClassName = "+c6.getName());//[LJava.lang.String
//返回类的简写名字
System.out.println("ClassSimpleName = "+c1.getSimpleName());

比较,可以使用等号

因为虚拟机为每个类管理一个对象.所以同样的类,不论怎么获取得到的Class都是同一个.经过测试和泛型无关,和引用无关.

System.out.println(c1==c2);//true
System.out.println(c1.equals(c3));//true,没有重写equals
List<Student> list1=new ArrayList<Student>();
List<Integer> list2=new ArrayList<Integer>();
ArrayList<Integer> list3=new ArrayList<>();
System.out.println(list1.getClass()==list2.getClass());//true
System.out.println(list1.getClass()==list3.getClass());//true

实例化对象(Java9中 newInstance方法已过时)

    //动态创建像同类的实例
    Object obj=null;
    try {
        obj=c1.newInstance();
    } catch (InstantiationException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    System.out.println(obj.getClass().getSimpleName());//Student
    System.out.println(obj);//[stuName=null,stuAge=0,stuSchool=null]

应当使用以下方法实例化对象

    try {
        obj1=c1.getDeclaredConstructor().newInstance();//第一个括号内为Constructor类型的所需参数,空表示无参构造器
        obj2=c1.getDeclaredConstructor(String.class,int.class,School.class).newInstance("test",10,sc);
    } catch (InstantiationException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    } catch (SecurityException e) {
        e.printStackTrace();
    }
    System.out.println(obj1);
    System.out.println(obj2);

利用反射分析类的结构

java.lang.reflect包下面有三个类
Feild-字段
Method-方法
Constructor-构造器

练习:通过类名/实例对象/地址获得该类的全部信息

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值