反射
文章目录
概述:
java是静态语言 , 但是因为其拥有反射机制 . 所以让Java变为了准动态语言 .
类class创建对象:
package com.heima.reflection;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
//通过反射,动态的创建对象
public class test_09 {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
//获得class对象
Class c1 = Class.forName("com.heima.reflection.User");
//创建一个对象
// User user = (User)c1.newInstance(); //本质上是调用了类的无参构造器
// System.out.println(user);
Constructor constructor1 = c1.getDeclaredConstructor();
User user = (User)constructor1.newInstance(); //本质上是调用了类的无参构造器
System.out.println(user);
//通过构造器创建对象
Constructor constructor = c1.getDeclaredConstructor(String.class, String.class, int.class, int.class);
User user2 = (User)constructor.newInstance("中国", "宏哥", 36, 18);
System.out.println(user2);
//通过放射调用普通方法
Constructor constructor3 = c1.getDeclaredConstructor();
User user3 = (User)constructor1.newInstance();
//通过反射获取一个方法
Method setName = c1.getDeclaredMethod("setName", String.class);
//将获取的方法与对象绑定
//invoke:激活的意思
//要激活的方法A.invoke(方法A将要所属的对象,"方法的参数")
setName.invoke(user3,"宏哥");
System.out.println(user3.getName());
//通过反射操作属性
System.out.println("==================================");
Constructor constructor4 = c1.getDeclaredConstructor();
User user4 = (User)constructor4.newInstance();
//获得指定属性
Field name = c1.getDeclaredField("name");
//不能直接操作私有属性,我们需要关闭程序的安全检测,属性或者方法的setAccessible()
name.setAccessible(true);
name.set(user4,"宏大哥");
System.out.println(user4.getName());
}
}