正射:知道某个类,类的地址,通过new关键字创建出对象,然后使用对象,编程时就知道了,直接在代码中new
反射: Java反射机制是在运行状态中,对于任意一个类,都能够直到这个类的所有属性和法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。
Java和反射相关的类:
Class 类型
Constructor 构造方法
Method 方法
Field 属性
获得Class的三种方法
(1).Object类中的getClass方法:适用于通过对象获得Class实例的情况
任何类都继承到了getClass方法,任意对象可以调用getClass方法获得Class实例
(2).类名.class方式:适用于通过类名获得Class实例的情况
任何类名加.class即返回Class实例
(3).Class类的静态方法 forName(String name) :适用于通过类型获得Class实例的情况,尤其类名是变量、
public static void main(String[] args) throws ClassNotFoundException {
Class clazz1 = new User().getClass();
Class clazz2 = new User().getClass();
System.out.println(clazz1==clazz2);
Class clazz3 = User.class;
System.out.println(clazz1==clazz3);
Class clazz4 = Class.forName("com.ffyc.mybatisdemo.reflexdemo.User");
System.out.println(clazz4);
}
Constructor类
通过getXXX方法获得构造方法的基本信息
getName:返回构造方法的名字
也可以创建实例
newInstance(Object initargs): 创建实例
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
//获得到了类的Class对象 new 反序列化 反射
Class c = Class.forName("com.ffyc.mybatisdemo.reflexdemo.User");
//创建一个对象
Object obj = c.newInstance();
//获取构造方法
Constructor constructor = c.getConstructor();
Object obj1 = c.newInstance();
Constructor constructor1 =c.getConstructor(int.class,String.class);
constructor1.newInstance(10,"jim");
c.getDeclaredConstructor();
}
Field类
field类将类的属性进行封装,可以获得属性的基本信息、属性的值,也可以对属性进行赋值
getName:返回属性的名字
Set:设置属性值
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
//获得到了类的Class对象 new 反序列化 反射
Class c = Class.forName("com.ffyc.mybatisdemo.reflexdemo.User");
//创建一个对象
Object obj = new User(10,"jim");
Class objClass = obj.getClass();
Field idf = objClass.getDeclaredField("id");
idf.setAccessible(true); //设置可以对私有属性操作,不建议,打破封装性
idf.set(obj,100);
System.out.println(idf.getName());*/
}
Method类的作用
method类将类中的方法进行封装,可以动态获得方法的信息
getName:获得方法名字
getParameterTypes: 获得方法参数类型
Method获取实例方法:
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
Field[] fields = objClass.getDeclaredFields(); //获取所有属性(包含私有)
String s = "{";
for(Field f:fields){
//f.getName()属性名,f.getType()属性类型
Method m= objClass.getMethod("get"+String.valueOf(f.getName().charAt(0)).toUpperCase()+f.getName().substring(1));
//System.out.println("set"+String.valueOf(f.getName().charAt(0)).toUpperCase()+f.getName().substring(1));
//动态获得属性的get方法
s+=f.getName()+":"+m.invoke(obj)+","; //执行获取到的obj对象的方法
}
s+="}";
System.out.println(s);
System.out.println(obj);
}