您的位置:首页 > 编程语言 > Java开发

Java基础之反射

2015-06-02 08:10 411 查看
反射(主要用到的类Class、Package、Field、Constructor、Method、Array)

*对象有编译类型和运行类型。

Object obj=new Date(); //编译类型Object,运行类型为Date类型

Date date=(Date)obj;//必须得进行强制转化才能调用Date类型的方法。

*反射就是得到某个类中所有成员的一种方式。

*Class类描述所有的类,Class的实例描述的就是类(也指的是jvm中的一份字节码)。

*Class:用于描述一切类、接口。

Class clz=Date.class;//clz表示的是Date的字节码

Class clz1=String.class;//clz1表示的是String的字节码

//区分是那种类型的字节码(用泛型表示)

Class<Date> clz=Date.class;

Class<String> clz1=String.class;

*创建Class对象(获取Class实例,返回的是全限定类名(包+类名))

//方法1

MyObject obj=new MyObject();

Class c1=obj.getClass(); //获取MyObject类的字节码,默认使用了泛型

//方法2

Class<?> c2=Class.forName("java.lang.String");//字符串必须是全类名(包+类名),<?>表示不知道返回类型。

//方法3

Class c3=String.class; //类名.class(获取一份字节码)

*同一份字节码在jvm中有且只有一份(一个类在虚拟机中只有一份字节码)。

*常用方法

getPackage() //获取Class对象所对应实体所在包的信息描述类的一个对象。返回Package对象

getModifilers();//返回Class对象所对应实体用整数表示的类修饰符值。

getName();//获取Class对象所对应实体的完全限定名。

getSuperClass();//获取Class对象所对应的实体的直接父类的Class对象。

getInterfaces();//获取Class对象所对应的实体实现的所有接口的Class对象数组。

getFields();//获取Class对象所对应实体的所有public字段。

getDeclaredFields();//获取所有字段

getConstructors();//获取Class对象所对应实体的所有public的构造方法。

getDeclaredConstrucotrs();//获取所有构造方法。

getmathods();//获取Class对象所对应的实体的所有public方法。

getDeclaredMethods();//获取所有方法

*Java默认实现的9大内置Class对象(八大基本数据类型和void关键字)

byte short int long float double char boolean void(关键字)

*对应Class对象

byte.class int.class char.class void.class ....

*八大基本数据类型多所对应的包装类中都有一个常量:TYPE

TYPE表示的是该包装类所对应的基本数据类型的Class实例

System.out.println(Integer.TYPE==int.class);//返回true

*通过构造器创建对象

//方法1(带参数构造器只能使用此方式)

Class clz=User.class; //找到类字节码

Constructor<User> c=clz.getConstructor();//找到被调用的指定构造器

User user=c.newInstance(); //执行该构造器

//传递参数

Class clz=User.class;

Constructor<User> c=clz.getConstructor(String.class);

User user=c.newInstance("fanqifu");

//用反射的好处

可以在只知道全限定名的情况下可以创建对象

Class.forName("全限定名");

//方法2

//直接使用Class对象的newInstance()方法(公共(public)的无参数构造器创建对象)。

Class clz=User.class;

User user=clz.newInstance();//相当于new创建对象

//方法3 :调用私有的构造器创建对象需要忽略掉安全检查

Class clz=User.class;

Constructor<User> c=clz.getDeclaredConstructor(String.class,int.class);

c.setAccessible(true);//忽略安全检查(私有类型的安全检查)

User user=c.newInstance("laofan",21);

*安全访问类

类AccessibleObject 子类Constractor、Field、Method(表示可以设置构造器,成员变量和成员方法的安全访问属性)。

使用setAccessible(true)方法设置是否可以访问,true表示可访问。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: