反射
- Field
- Constructor
- Method
- Annotation
public class Dog{
private String color;
public String name;
}
public class Test{
public static void main(String[] args){
// 第一种
Class dogClass = Dog.class;
// 第二种
Class dogClass2 = Clas.forName("xx.Dog");
// 第三种
Dog dog = new Dog();
Class dogClass3 = dog.getClass();
System.out.println(dogClass.getSuperClass().getName());
System.out.println(dogClass.isInterface());
Dog dog2 = (Dog)dogClass.newInstance();
}
}
Field
public class Test{
public static void main(String[] args){
// 第一种
Class dogClass = Dog.class;
Dog dog = (Dog)dogClass.newInstance();
// 获取所有字段(public)
Field[] fields = dogClass.getFields();
// 获取所有字段
Field[] fields2 = dogClass.getDeclaredFields();
Field name = dogClass.getField("name");
name.set(dog,"xxx");// 赋值
System.out.println(name.get(dog));
Field color = dogClass.getDeclaredField("color");
color.setAccessible(true);// 私有属性 暴力注入
color.set(dog,"red");
System.out.println(color.getType());
}
}
Method
- class.getMethod(“xx”,[String.class,…])
- class.getMethods()
- class.getDeclareMethod(“xx”)
- class.getDeclareMethods()
- method.invoke(obj,["",…])
Construct
- class.getConstructor([…])
- class.getConstructors()
- construct.newInstance([…])
Annotation
- class.getAnnotation(xxx.class)
- class.getDeclareAnnotation(xxx.class)
案例
//反射加载类Person 3种方法
//1
Class clazz = Class.forName("com.sws.Peerson");
//2
Class clazz1 = new Person().getClass();
//3
Class clazz3 = Person.class;
//反射类的构造函数并创建对象
Class clazz = Class.forName("com.sws.Peerson");
//获取无参构造函数
Constructor c1 = clazz.getConstructor(null);
Person p = (Person)c.newInstance(null);
//--------------------
Constructor c2 = clazz.getConstructor(String.class);//获取有参构造函数
Person p = (Person)c.newInstance("name");
//--------------------
//获取有参构造函数
Constructor c3 = clazz.getConstructor(String.class,int.class);
Person p = (Person)c.newInstance("name",12);
//--------------------
//获取有参构造函数
Constructor c4 = clazz.getConstructor(String.class,int.class);
Person p = (Person)c.newInstance("name",12);
//获取私有构造函数,参数为list等类型
Constructor c4 = clazz.getDeclaredConstructor(List.class);
c4.setAccessible(true);//暴力反射,强制访问私有构造函数
Person p = (Person)c.newInstance(new ArrayList());
//反射创建对象另一个方法
Class clazz = Class.forName("com.sws.Peerson");
Person p = (Person)clazz.newInstance();//无参构造函数
Class clazz = Class.forName("com.sws.Peerson");
Person p = (Person)clazz.newInstance();
//--------------------
//反射类的方法
//public void aal()
Method method1 = clazz.getMethod("aal",null);
method1.invoke(p,null);
//--------------------
//public void aal(String name,int password)
Method method2 =
clazz.getMethod("aal",String.class,int.class);
method2.invoke(p,"name",123);
//--------------------
//public Class[] aal(String name,int[] password)
Method method3 =
clazz.getMethod("aal",String.class,int[].class);
Class cs[] =
(Class[])method3.invoke(p,"name",new int[]{1,2,3});
//--------------------
//private void aal(InputStream in)
Method method4 =
clazz.getDeclaredMethod("aal",InputStream.class);
method4.setAccessible(true);
method.invoke(p,new FileInputStream("c:\\1.txt"));
//--------------------
//private static void aal(int num)
Method method5 =
clazz.getMethod("aal",int.class);
method5.invoke(null,23);//无需对象
//--------------------
//public static void main(String[] args)
Method method6 =
clazz.getMethod("main",String[].class);
method6.invoke(null,new Object[]{new String[]{"aa","bb"}});
//method6.invoke(null,(Object)new String[]{"aa","bb"});
Class clazz = Class.forName("com.sws.Peerson");
Person p = new Person();
//反射字段
//--------------------
//public String name="aaa"
Field f = clazz.getField("name");
//获取字段值
Object value = f.get(p);
//获取字段类型
Class type = f.getType();
if(type.equals(String.class)){
String svalue = (String)value;
System.out.println(svalue);
}
//设置字段的值
f.set(p,"name");
System.out.println(p.name);
//--------------------
//反射私有对象
//private int password = 123
Field f1 = class.getDeclaredField("password");
f1.setAccessible(true);
int password = f1.get(p)
//--------------------
//反射私有静态字段
//private static int age = 23;
Field f2 = class.getDeclaredField("age");
f2.setAccessible(true);
int age = f2.get(p)
IOC
原始方法
entity
- User
public class User implements Serializable{
private String id;
private String username;
private String password;
private int age;
// get set
}
- Book
public class Book implements Serializable{
private int id;
private String name;
// get set
}
dao
- UserDao
// 查询数据库
// 此处简化
public class UserDao{
public User findUserById(int id){
return null;
}
public List<User> findaAllUsers(){
return null;
}
public User findUserByUserName(String username){
return null;
}
public void saveUser(User user){
}
}
- BookDao
// 查询数据库
// 此处简化
public class BookDao{
public Book findBookById(int id){
return null;
}
public List<Book> findAllBooks(){
return null;
}
public void saveBook(Book book){
}
}
service
- UserService
public class UserService{
private UserDao userDao = new UserDao();
// 登录
public void login(String username){
User user = userDao.findUserByUserName(username);
System.out.println(user.getUserName()+"登录");
}
// 注册
public void regist(User user){
userDao.saveUser(user);
System.out.println(user.getUserName()+"注册");
}
}
- BookService
public class BookService{
private UserDao userDao = new UserDao();
private BookDao bookDao = new BookDao();
public void borrow(User user,Book book){
System.out.println(user.getUserName()+"借书"+book.getName());
}
}
UserDao,BookDao被多次重复创建,浪费资源
改进
- bean.config
# 接口=实现类
# 这里接口省略
xxx.xxx.BookService = xxx.xxx.BookService
xxx.xxx.BookDao = xxx.xxx.BookDao
xxx.xxx.UserService = xxx.xxx.UserService
xxx.xxx.UserDao = xxx.xxx.UserDao
- ApplicationContext
// 上下文
public class ApplicationContext{
private HashMap<Class,Object> beanFactory = new HashMap();
public T getBean(Class clazz){
return (T)beanFactory.get(clazz);
}
public void initContext(){
// 集中实例化
//beanFactory.put(UserDao.class,new UserDao());
//beanFactory.put(BookDao.class,new BookDao());
//beanFactory.put(UserService.class,new UserService());
//beanFactory.put(BookService.class,new BookService());
InputStream resource = ApplicationContext.class.getClassLoader().getResourceAsStream("xxx/bean.config")
Properties properties = new Properties();
properties.load(resource);
Set<Object> keys = properties.keySet();
for(Object key : keys){
beanFactory.put(Class.forName(key.toString()),
Class.forName(properties.getProperty(key).toString()).newInstance());
}
}
}
- BootStrap
// 启动类
public class BootStrap{
public static void main(String[] agrs){
ApplicationContext applicationContext = new ApplicationContext();
applicationContext.initContext();
}
}
Annotation改进
注解
- Bean
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
publlic @interface Bean{
}
- AutoWired
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoWired{
}
@Bean
public class BookService{
@AutoWired
private UserDao userDao;
@AutoWired
private BookDao bookDao;
}
@Bean
public class UserService{
}
@Bean
public class BookDao{
}
@Bean
public class UserDao{
}
- ApplicationContext
// 上下文
public class ApplicationContext{
private HashMap<Class,Object> beanFactory = new HashMap();
public T getBean(Class clazz){
return (T)beanFactory.get(clazz);
}
public void initContextByAnnotation(){
load();
}
private String filePath;
public static void load(){
// 编译后的路径
filePath = ApplicationContext.class.getClassLoader().getResource("").getFile();
System.out.println(filePath);
// 加载
loadOne(new File(filePath));
// 装配
assembleObject();
}
public void assembleObject(){
// 装配
for(Map.Entry<Class,Object> entry : beanFactory.entrySet()){
Object obj = entry.getValue();
Class<?> aClass = obj.getClass();
Field[] declaredFields = aClass.geDeclaredFields();
for(Field field : declaredFields){
AutoWired annotation = field.getAnnotation(AutoWired.class);
if(annotation!=null){
field.setAccessible(true);
field.set(obj,beanFactory.get(field.getType()));
}
}
}
}
private void loadOne(File fileParent){
// 通过递归查询文件
if(fileParent.isDirectoru()){
File[] childrenFiles = fileParent.listFiles();
if(childrenFiles == null || childrenFiles.length == 0){
retrun;
}
for(File child : childrenFiles){
if(child.isDirectory()){
loadOne(child);
}else{
// filePath 根目录
String pathWithClass = child.getAbsoultePath().subString(filePath.length()-1);
if(pathWithClass.contains(".class")){
String fullName = pathWihClass.replaceAll("\\\\",".")
try{
Class<?> aClass = Class.forName(fullName);
// 判断是否是接口
if(!aClass.isIerface()){
Bean annotation = aClass.getAnnotation(Bean.class);
if(annotation!=null){
Object instance = aClass.newInstance();
beanFactory.put(aClass,instance);
}
}
}catch(Exception){
}
}
}
}
}
}
}
- BootStrap
// 启动类
public class BootStrap{
public static void main(String[] agrs){
ApplicationContext applicationContext = new ApplicationContext();
applicationContext.initContextByAnnotation();
}
}