市面上,人称依赖注入方式有4种:
1.构造函数注入 2.setter注入 3.接口注入 4.注解注入
我的关注点,只涉及前两个。Spring要使用依赖注入,也要有以下步骤
- 首先,要获取Class对象。
- 其次,要获取构造函数,或setter方法。
- 最后,调用方法,注入依赖对象。
Java中获得Class对象的三种方式:
1. 使用Class类的forName(String clazzName)静态方法。
类名必须是全限定类名(包含完整包名)
2. 调用某类的class属性来获取该类对应的Class对象。
Clazz.class将会返回Clazz类对应的Class对象。
3. 调用某个对象的getClass()方法。java.lang.Object类中的一个方法。
第二种方式的优势:
代码更安全。程序在编译的时候就能检查要访问的class对象是否存在;
程序性能更好。这种方式无须调用方法。
package com.neo.spring;
import org.springframework.stereotype.Controller;
import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class ClassTest {
private ClassTest() {
}
public ClassTest(String args){
}
public String classInfo;
public void setClassInfo(String classInfo){
this.classInfo = classInfo;
}
public void info() {
System.out.println("执行无参数的info方法");
}
public static void main(String[] args) throws NoSuchFieldException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
Class<ClassTest> clazz = ClassTest.class;
//获取所有构造器
Constructor[] constructors = clazz.getDeclaredConstructors();
//获取public构造器
Constructor[] publicConstructors = clazz.getConstructors();
//获取所有方法
Method[] methods = clazz.getDeclaredMethods();
//获取所有public方法
Method[] pubMethod = clazz.getMethods();
//获取所有注解
Annotation[] anns = clazz.getAnnotations();
//获取所有的属性
Field [] fields = clazz.getFields();
System.out.println(clazz.getField("classInfo"));
Method setClazzInfoMethod = clazz.getMethod("setClassInfo", String.class);
setClazzInfoMethod.invoke("hello world");
for (Field field: fields){
System.out.println(field);
}
/* for (Constructor constructor: constructors) {
System.out.println(constructor);
}
for (Constructor constructor: publicConstructors) {
System.out.println(constructor);
}*/
// for (Method method: pubMethod) {
// System.out.println(method);
// }
}
}
class A {
public A(){}
public static void main(){}
}
结果里包含很多继承自Object类的方法