今天学习了反射,感觉很厉害,什么东西都能拿到,黑客必备神技啊!!!!
反射
一、反射机制的概述
Java反射机制就是在运行状态下,动态地获取任意一个类的所有属性和方法,并且能够使用。
二、字节码对象获取
a:类对象.getClass方法
// 1.对象
Student s = new Student();
Class class1 = s.getClass();
b:类名.class
// 2.类名 .class
Class class2 = Student.class;
c:通过Class类中的静态方法, 指定字符串, 该字符串是类的全类名(包名+类名)
// 3.全限定名 Class类的方法
Class class3 = Class.forName("com.itheima.day13.Student");
三、反射获取构造方法
a:空参构造
//1.获取字节码对象
Class clazz = Class.forName("com.itheima.day13.Student");
//2.获取空参构造
//2.1 空参方法特有
Object obj1 = clazz.newInstance();
//2.2 普通获取构造
Constructor con = clazz.getConstructor();
Object obj2 = con.newInstance();
b:有参构造
//1.获取字节码对象
Class clazz = Class.forName("com.itheima.day13.Student");
//2.获取有参构造
Constructor con2 = clazz.getConstructor(String.class,int.class);
Object obj3 = con2.newInstance("李四",24);
四、反射获取成员变量
a:public 修饰
//1.字节码对象
Class clazz = Class.forName("com.itheima.day13.Student");
//2.类对象
Object obj = clazz.newInstance();
//3.获取成员变量(age 年龄) public
Field f = clazz.getField("age");
//获取值
Object age1 = f.get(obj);
//修改
f.set(obj, 333);
b:其它修饰符
//1.字节码对象
Class clazz = Class.forName("com.itheima.day13.Student");
//暴力反射获取private修饰的 name属性
Field f2 = clazz.getDeclaredField("name");
//取消权限
f2.setAccessible(true);
//不能直接访问,必须取消权限
f2.set(obj, "哈哈哈哈");
五、反射获取成员方法
//1.
Class clazz = Class.forName("com.itheima.day13.Student");
//2.创建对象
Object obj = clazz.newInstance();
//2.获取公共有参方法
Method m1 = clazz.getMethod("setName", String.class);
//使用
m1.invoke(obj, "张三");
//获取公共无参方法 有返回值
Method m2 = clazz.getMethod("getName");
Object name = m2.invoke(obj);
System.out.println(name);
//获取私有方法
Method m3 = clazz.getDeclaredMethod("method01");
m3.setAccessible(true);
m3.invoke(obj);
//获取静态
Method m4 = clazz.getMethod("method02");
//两种都行,推荐第二种
m4.invoke(obj);
m4.invoke(null);
六、javaBean类和BeanUtils
a:javaBean规范:
类使用公共进行修饰
提供私有修饰的成员变量
为成员变量提供公共getter和setter方法
提供公共无参的构造
(实现序列号接口)
b:BeanUtils的常用方法
static void setProperty(Object bean, String name, Object value) 设置任意成员属性
static String getProperty(Object bean, String name) 获取任意成员属性
static void populate(Object bean, Map properties) 修改任意对象中的属性, 为传入Map集合中的键和值
|
|