什么是java反射
就是正在运行,动态获取这个类的所有信息。
反射机制的作用
把.class -> .java 通过反射机制访问java对象的属性,方法,构造方法等。
反射机制的应用场景
jdbc加载驱动 springioc 框架
反射创建对象的方式
public class Person {
private String name;
private String age;
public Person() {}
public Person(String name, String age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
public static void main(String[] args) throws Exception {
//反射无参创建对象
Class<?> forName = Class.forName("com.shuwenlong.Person");
Person person = (Person) forName.newInstance();
//反射有参创建对象
Class<?> forName2 = Class.forName("com.shuwenlong.Person");
Constructor<?> constructor = forName2.getConstructor(String.class,String.class);
Person person1 = (Person) constructor.newInstance("wenlong","21");
}
反射创建api
| 方法名称 | 作用 |
| getDeclaredMethods[] | 获取该类的所有方法 |
| getReturnType() | 获取该类的返回值 |
| getParameterTypes() | 获取传入参数 |
| getDeclaredFields() | 获取该类的所有字段 |
| setAccessible | 允许访问私有成员 |
使用反射为类私有属性赋值
public static void main(String[] args) throws Exception {
Class<?> clazz = Class.forName("com.shuwenlong.Person");
//获取类中的所有属性
Field[] fields = clazz.getDeclaredFields();
for (Field f : fields) {
System.out.println(f.getName());
}
//获取类中所有方法
Method[] methods = clazz.getDeclaredMethods();
for (Method m : methods) {
System.out.println(m.getName());
}
//初始化对象
Person person = (Person) clazz.newInstance();
Field id = clazz.getDeclaredField("age");
//标记为true,允许为私有变量赋值
id.setAccessible(true);
id.set(person, "21");
System.out.println(person.getAge());
}
禁止反射机制初始化
将构造函数私有化
手写SpingIOC框架
什么是springioc就是把每一个实体类与实体类之间的关系交给第三方容器管理。
//实体类
public class User {
private String name;
private String age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String toString() {
return "User [name=" + name + ", age=" + age + "]";
}
}
//xml配置
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<bean id="user1" class="com.shuwenlong.User">
<property name="name" value="文龙"></property>
<property name="age" value="21"></property>
</bean>
<bean id="user2" class="com.shuwenlong.User">
<property name="name" value="bug"></property>
<property name="age" value="100"></property>
</bean>
</beans>
//手写springioc
class MySpringIOC {
private String path;
public MySpringIOC(String path) {
this.path = path;
}
public Object getBeans(String beanName) throws Exception {
if(beanName == null || beanName.equals("")) {
return "传入参数不能为空";
}
SAXReader saxReader = new SAXReader();
Document root = saxReader.read(this.getClass().getClassLoader().getResource(path));
Element element = root.getRootElement();
List<Element> elements = element.elements();
for (Element e : elements) {
String id = e.attributeValue("id");
if(!id.equals(beanName)) {
continue;
}else {
String c = e.attributeValue("class");
Class<?> clazz = Class.forName(c);
Object newInstance = clazz.newInstance();
List<Element> el = e.elements();
for (Element ele : el) {
String name = ele.attributeValue("name");
String value = ele.attributeValue("value");
Field nameField = clazz.getDeclaredField(name);
nameField.setAccessible(true);
nameField.set(newInstance,value );
}
return newInstance;
}
}
return null;
}
}
//测试
public class Demo {
public static void main(String[] args) throws Exception {
MySpringIOC ms = new MySpringIOC("app.xml");
User u = (User) ms.getBeans("user1");
System.out.println(u.toString());
}
}
本文深入解析Java反射机制,包括其工作原理、应用场景如JDBC、Spring IOC框架,以及如何使用反射创建对象、调用方法和访问私有成员。同时,介绍了如何通过反射实现自定义的Spring IOC框架。
1095

被折叠的 条评论
为什么被折叠?



