使用反射机制简单模拟IOC效果

package anno;

import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;

/**
 * @program: tx_annotation_demo
 * @description: 使用反射机制模拟实现IOC(控制反转)
 * @author: czg
 * @create: 2019-09-27 22:41
 */
public class MySpring {

    public static void main(String[] args) {
        //题目:入参:一个包名.类名字符串  出参:一个对应的对象 对象中已存在数据(数据存在无参构造方法的注解中)

        Person p=(Person)Ioc("anno.Person");
        System.out.println(p.toString());
    }

    public static Object Ioc(String ClassName){

        Object o =null;
        try {
            Class clazz=Class.forName(ClassName);
             //获得对象
             o = clazz.newInstance();
             //获得无参构造方法
            Constructor constructor = clazz.getConstructor();

            System.out.println("--------------开始获得注解中的数据---------------");
            //获得无参构造方法上面的自定义注解
            Annotation annotation = constructor.getAnnotation(MyAnnotaion.class);
            //获得注解类的Class
            Class aClass = annotation.getClass();
            //获得注解类的方法
            Method test = aClass.getMethod("test");
            //获得其里面的数据
            String[] data =(String[]) test.invoke(annotation);
            System.out.println("注解中的数据:"+Arrays.toString(data));

            System.out.println("--------------构建组合对象set方法:set+大写首字母的对象属性名---------------");

            //构建组合Object所代表对象中的setXxxx方法
            //获得私有的属性
            Field[] fields = clazz.getDeclaredFields();
            //循环遍历属性名
            for (int i=0;i<fields.length;i++){
                Field field=fields[i];
                String name = field.getName();
                //组合属性对应的set方法
                StringBuilder setMethod=new StringBuilder("set").append(name.substring(0,1).toUpperCase())
                        .append(name.substring(1));
                //获得属性的类型
                Class filedType=field.getType();
                //获得并运行set方法
                Method method = clazz.getMethod(setMethod.toString(),filedType);
                //需要将注解读取到的String字符串转出其他对应的类型
                //Integer i=new Integer("");
                //找到属性类型对应待String类型的构造函数 构造出新的对象
                method.invoke(o,filedType.getConstructor(String.class).newInstance(data[i]));
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

        return o;
    }

}
package anno;

/**
 * @program: tx_annotation_demo
 * @description: 自定义注解测试使用
 * @author: czg
 * @create: 2019-09-27 21:54
 */
public class Person {

    //@MyAnnotaion(test = {"czg","18","男"})
    private String name;

    private Integer age;

    private String sex;

    @MyAnnotaion(test = {"czg","18","男"})
    public Person() {
    }

    public Person(String name, Integer age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name=‘" + name + ‘\‘‘ +
                ", age=" + age +
                ", sex=‘" + sex + ‘\‘‘ +
                ‘}‘;
    }
}
package anno;

import java.lang.annotation.*;

/**
 * @program: tx_annotation_demo
 * @description:
 *
 * 自定义注解(与接口用法有点类似)
 * 特点:注解中的方法必须有返回值,返回值必须是以下五种
 *     基本数据类型 String类型 枚举类型enum 注解类型@  数组类型(数组内部必须是前面四种)
 *
 * 注解要使用还必须使用Java提供好的元注解(元注解:元注解不是拿来使用的,是用来辅助说明自定义注解的)
 *
 * 常见元注解有:@Target  说明声明的注解是放在哪里使用的(注解一般放在 类的上面,属性上面,方法的上面,构造方法的上面,参数前面)
 *                     ElementType.FIELD(属性上面),ElementType.METHOD(方法上面),ElementType.CONSTRUCTOR(构造方法上面) 注解可以在
 *            @Retention 描述当前的这个注解存在什么作用域中 SOURCE:源码文件  CLASS:字节码文件   RUNTIME:内存运行
 *            @Inherited 描述当前这个注解是否会被子类对象继承
 *            @Documented 描述当前这个注解是否能生成文档
 * @author: czg
 * @create: 2019-09-27 20:50
 */
@Target({ElementType.FIELD,ElementType.METHOD,ElementType.CONSTRUCTOR})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotaion {

    public static final String NAME_TEST="XXXX";//一般注解里面比较少用这种

    //public abstract 一般是默认的
    public abstract String[] test();
}

原文地址:https://www.cnblogs.com/czgxxwz/p/11601014.html

时间: 2024-10-29 18:51:33

使用反射机制简单模拟IOC效果的相关文章

java反射机制简单介绍

1.字节码.所谓的字节码就是当java虚拟机载入某个类的对象时,首先须要将硬盘中该类的源码编译成class文件的二进制代码(字节码),然后将class文件的字节码载入到内存中,之后再创建该类的对象 2.java反射的基础是Class类(注意不是小写的class),Class类实例代表着内存中的一份字节码.常见的获取Class类对象的方法例如以下(第一种为对象的方法,另外一种为类的方法): Dog dog = new Dog(); Class dogClass = dog.getClass();

简单模拟评论效果

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>模拟评论</title> <style> #div1{width: 400px; height: 200px; background-color: gray; text-align: center; margin: 0 auto;} #div2{

java反射机制-简单实例

public class Car { private String brand; private String color; private int maxSpeed; public Car() { } public Car(String brand, String color, int maxSpeed) { this.brand = brand; this.color = color; this.maxSpeed = maxSpeed; } public String getBrand()

Java反射机制简单使用

1.Java反射相关类所在package: java.lang.reflect.* 2.开始使用Reflection: 使用reflect相关类,遵循三个步骤: a.获取想要操作类的 java.lang.Class 对象. 如: Class c = Class.forName("java.lang.String"); //得到的是一个String类的对象 或者使用: Class c = int.class; b.调用诸如 getDeclaredMethods() 方法,用以获取该类的方

简单模拟IOC容器:为添加了@Autowired的属性赋值(初始值)

创建@Autowired注解 package com.zzj.test; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; //设置范围和生存周期 @Target({ElementType.TYPE,ElementType.FI

简单模拟IOC容器:返回对象并能抛出异常

本次要求:已知com.zzj.vo包下分别有Tiger.lion.Elephant三个Java源文件,请据此实现以下功能:①.自定义一个名为Component的注解,要求该注解只能用于类且代码运行时该注解依然有效:②.为Tiger和Lion类添加component注解③.在Application类中定义静态代码块,该代码块可自动将有Component注解修饰的类创建对象并放在Map集合中:然后定义一个名为getBean的static方法,要求传入Class类实例时返回该Class类对应类的对象,

Java反射机制详解(3) -java的反射和代理实现IOC模式 模拟spring

IOC(Inverse of Control) 可翻译为“控制反转”,但大多数人都习惯将它称为“依赖注入”.在Spring中,通过IOC可以将实现类.参数信息等配置在其对应的配置文件中,那么当 需要更改实现类或参数信息时,只需要修改配置文件即可,这种方法在上例的基础上更进一步的降低了类与类之间的耦合.我们还可以对某对象所需要的其它对象进 行注入,这种注入都是在配置文件中做的,Spring的IOC的实现原理利用的就是Java的反射机制, Spring还充当了工厂的角色,我们不需要自己建立工厂类.S

自己实现简单Spring Ioc

IoC则是一种 软件设计模式,简单来说Spring通过工厂+反射来实现IoC. 原理简单说明: 其实就是通过解析xml文件,通过反射创建出我们所需要的bean,再将这些bean挨个放到集合中,然后对外提供一个getBean()方法,以便我们获得这bean.通俗来讲就如同婚姻介绍所,只需要告诉它找个什么样的女朋友,然后婚介就会按照我们的要求,提供一个mm,如果婚介给我们的人选不符合要求,我们就会抛出异常. 简单实现: 1.需要引用maven依赖: <dependency> <groupId

moon 反射机制---java.lang.reflect包

java反射机制:在运行状态中,对于一个已经加载到JVM的java对象/类 在程序中实现访问.检查.修改.描述java对象本身的信息(构造方法.方法.成员变量.类本身的信息) 这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. C++,Java,C#不是动态语言.但是JAVA有着一个非常突出的动态相关机制:Reflection, 反射是java中一种强大的工具,能够使我们很方便的创建灵活的代码,这些代码可以再运行时装配,无需在组件之间进行源代码链接. 二,反射机制的作用: