一、反射
反射它是框架设计的灵魂。
框架: 它就是一个半成品,客户可以引入该框架,在框架的基础上填写自己的业务代码。提高开发效率。 比如: springmvc mybatis框架 。
反射: 它就是把类中成员封装到其他类对象的形式。在通过该类对象可以获取成员的信息。
二、获取Class反射类的方式
获取Class反射类有三种方式:
第一种:Class.forName("类的全路径")
<bean id="s" class="com.fudu.Student">app.getBean("s");
第二种: 类.class
Mybatis----session.getMapper(StudentDao.class)
第三种: 对象名.getClass();
public static void main(String[] args) throws ClassNotFoundException {
//第一种
Class<?> aClass = Class.forName("org.reflect.demo01.Point");
// 第二种
Class<Point> aClass1 = Point.class;
//第三种
Point s = new Point();
Point s2 = new Point();
Class<? extends Point> aClass2 = s.getClass();
Class<? extends Point> aClass3 = s2.getClass();
System.out.println(aClass==aClass1);
System.out.println(aClass==aClass2);
System.out.println(aClass1==aClass2);
System.out.println(aClass3==aClass2);
}
三、 通过反射类获取对应的类对象
反射对象.newInstance();
Class<Student> aClass1 =Student.class;
Student o1 = aClass1.newInstance();//通过反射获取对应的类对象
Student o2 = aClass1.newInstance();//通过反射获取对应的类对象
System.out.println(o1);
System.out.println(o2);
System.out.println(o2==o1);
四、获取属性类对象.
Class<Student> aClass = Student.class;
// Field sexField = aClass.getDeclaredField("sex");
// System.out.println(sexField);
// Field phone = aClass.getDeclaredField("phone");
// System.out.println(phone);
Field[] declaredFields = aClass.getDeclaredFields();
for (Field f:declaredFields){
System.out.println(f);
}
System.out.println("获取本类以及父类中所有public属性对象");
// Field address = aClass.getField("address");
// System.out.println(address);
// Field phone = aClass.getField("phone");
// System.out.println(phone);
Field[] fields = aClass.getFields();
for (Field field:fields) {
System.out.println(field);
}
1.Field类中常见的方法
setAccessible(true); //设置私有访问权限
set(o,value);
Class<Son> sonClass = Son.class;
Son son = sonClass.newInstance();
System.out.println(son);
Field nameField = sonClass.getDeclaredField("name");
//IllegalAccessException:
nameField.setAccessible(true); //设置私有访问权限
nameField.set(son,"李四"); //为对象son的name属性赋值“李四”
System.out.println(son);
五、获取方法类对象
getMethods():
getMethod(name,Class...)
getDeclaredMethods();
getDeclaredMethod(name,Class 参数的类型)
Method show = sonClass.getDeclaredMethod("show",Integer.class,String.class);
1.Method类中常见的方法
Object invoke(Object o,Object... values)
Object o = show.invoke(son, 18, "hello");//执行该方法
System.out.println(o);
六、获取Constructor对象
package com.demo03;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class Test03 {
public static void main(String[] args) throws Exception {
Class<?> aClass = Class.forName("com.demo03.Son");
Constructor<?> constructor = aClass.getConstructor();
Object o = constructor.newInstance(); //<bean />
System.out.println(o);
Constructor<?> constructor1 = aClass.getConstructor(Object.class, int.class);
Object instance = constructor1.newInstance("李四", 28);
System.out.println(instance);
}
}
class Son{
private String name;//private=2 public=1 default=0 protected=4
public int age;
public void show(Integer a,String n){
System.out.println("~~~~~~~~~~~~~~~~~~show~~~~~~~~~~~~~"+a+";;name="+n);
}
public Son(String name) {
this.name = name;
}
public Son() {
}
public Son(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Son{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}