反射(主要用到的类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表示可访问。
*对象有编译类型和运行类型。
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表示可访问。