反射

/**
 *java.lang.Class类:继承了Object类,描述了类的相关信息,是java反射机制的入口。
 *一个类中信息常见的组成:
 *构造函数:无,不能通过new关键创建Class对象,一般通过Class.forName(全类名)获取Class对象;
 *常用方法:
 *    getDeclaredFields():返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。
 *    getDeclaredMethods() 
          返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。
    getDeclaredConstructors() 
          返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法
      getModifiers():返回类的修饰符。0代表默认,1代表public
      getSimpleName():返回简单类名,不包含包名。
      getName():返回全类名,包含包名。
      getSuperclass():返回父类类型
      getInterfaces():返回实现的接口类型
      
 *1.成员变量或属性:Field
 *    getModifiers():返回属性的修饰符。0代表默认,1代表public,2代表private,4代表protected
 *    getType():返回属性的类型
 *    getName():返回属性名称
 *2.成员方法:Method
 *    getModifiers():返回方法的修饰符
 *    getReturnType():返回方法的返回值类型
 *    getName():返回方法名
 *  getParameterTypes():返回方法的参数类型
 *  getExceptionTypes():返回方法声明的异常类型
 *3.构造方法:Constructor
 *  getModifiers():返回构造方法的修饰符        
 *  getName():返回构造方法名
 *  getParameterTypes():返回构造方法的参数类型
 *  
 */
public class TestClass {
    
    /**
     * 获取类的相关信息
     */
    public void testClassinfo(){
        try {
            Class clazz = Class.forName("cn.zzsxt.entity.Student");
            Package pack =clazz.getPackage();
            System.out.println(pack.getName());
//            String clazzName = clazz.getName(); //包名+类名
            int modify = clazz.getModifiers();//获取类的修饰符
            String simpleName = clazz.getSimpleName();//类名
            Class superClazz = clazz.getSuperclass();//获取父类
            Class[] interfaceClazz = clazz.getInterfaces();//获取实现的接口
            System.out.println("修饰符:"+modify);
            System.out.println("类名:"+simpleName);
            System.out.println("继承的父类:"+superClazz);
            System.out.println("实现的接口:"+Arrays.toString(interfaceClazz));
            
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        
    }
    /**
     * 获取属性信息
     */
    public void testField(){
        try {
            //获取Student对象对应的Class信息
            Class clazz = Class.forName("cn.zzsxt.entity.Student");//动态加载一个类参数应该为该类的全类名(包名+类名)
            Field[] fs = clazz.getDeclaredFields();//获取该类中的属性信息
            for (Field field : fs) {
                int modifer = field.getModifiers();//获取修饰符 1:public,2:private,4:protected 0:默认
                Class fieldClass = field.getType();//获取属性的类型
                String fieldName = field.getName();//获取属性名称
                System.out.println(modifer+"---"+fieldClass+"---"+fieldName);
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    /**
     * 获取方法信息
     */
    public void testMethod(){
        try {
            Class clazz = Class.forName("cn.zzsxt.entity.Student");//动态加载一个类参数应该为该类的全类名(包名+类名)
            Method[] ms = clazz.getDeclaredMethods();//获取类中的方法信息
            for (Method method : ms) {
                int modify = method.getModifiers();//获取方法的修饰符
                Class returnTypeClass = method.getReturnType();//获取方法的返回值类型
                String methodName = method.getName();//获取方法名
                Class[] paramClazz = method.getParameterTypes();//获取参数类型
                Class[] exceptionClazz = method.getExceptionTypes();//获取异常类型
                System.out.println(modify+"---"+returnTypeClass+"---"+methodName+"---"+Arrays.toString(paramClazz)+"---"+Arrays.toString(exceptionClazz));
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    
    /**
     * 获取构造函数
     */
    public void testConstructor(){
        try {
            Class clazz = Class.forName("cn.zzsxt.entity.Student");
            Constructor[] cs=  clazz.getConstructors();
            for (Constructor constructor : cs) {
                int modify = constructor.getModifiers();//获取构造函数的修饰符
                String constructorName = constructor.getName();//获取构造函数的名称
                Class[] paramClazz = constructor.getParameterTypes();//获取构造函数的参数
                System.out.println(modify+"---"+constructorName+"---"+Arrays.toString(paramClazz));
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    
    public static void main(String[] args) {
        TestClass test = new TestClass();
        test.testClassinfo();
//        test.testField();
//        test.testMethod();
//        test.testConstructor();
    }
}
/**
 *java.lang.Class类
 *常用方法:
 * 获取Class类型对象的方式:
 * 1.Class.forName(全类名);***
 * 2.类名.class   eg:TestClass2.class
 * 3.在成员方法中使用 this.getClass()方法
 * 
 * 使用Class类型创建对象===>调用 newInstance()方法可以动态创建对象
 * Class clazz = Class.forName("cn.zzsxt.entity.Student");
 * Object obj=  clazz.newInstance();
 *  
 *    Field[] getDeclaredFields():获取类中所有的属性 ***
 *    Field getDeclaredField(String name):获取类中指定名称的属性信息
 *    Method[] getDeclaredMethods():获取类中所有的方法 ***
 *    Method getDeclaredMethod(String name,Class...clazzType):获取类中指定名称的方法信息
 *    getDeclaredConstructors() **
          返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法
      getModifiers():返回类的修饰符。0代表默认,1代表public
      getSimpleName():返回简单类名,不包含包名。
      getName():返回全类名,包含包名。
      getSuperclass():返回父类类型
      getInterfaces():返回实现的接口类型 
 * 
 */
public class TestClass2 {
    public void m(){
//        Class clazz = this.getClass();
//        Class clazz = Class.forName("cn.zzsxt.demo.TestClass2");
//        Class clazz = TestClass2.class;
    }
    public static void main(String[] args) throws Exception{
//        Student student = new Student();//创建对象
        
//        Class clazz = Class.forName("cn.zzsxt.entity.Student");
        Class clazz = Student.class;
        Object obj = clazz.newInstance();
        System.out.println(obj);
        //获取属性信息
//        clazz.getDeclaredFields()//获取所有属性的信息
        Field field = clazz.getDeclaredField("name");//获取指定名称的属性信息
        int modify = field.getModifiers();
        Class fieldType = field.getType();
        String fieldName = field.getName();
        System.out.println(modify+"---"+fieldType+"---"+fieldName);
//        clazz.getDeclaredMethods();//获取所有方法
        Method method = clazz.getDeclaredMethod("setName", String.class);
        int modifyMethod = method.getModifiers();
        Class returnType = method.getReturnType(); 
         String methodName = method.getName();
        System.out.println(modifyMethod+"---"+returnType+"----"+methodName);
        Package pack = clazz.getPackage();
        System.out.println("包名:"+pack.getName());
    }
}
/**
 * java.lang.reflect.Constructor类:提供关于类的单个构造方法的信息以及对它的访问权限。 
 * getModifies():获取构造函数的修饰符
 * getName():获取构造函数的名称
 * getParameterTypes():获取构造函数的参数类型 
 *调用无参构造和有参构造的方式:
 *无参构造:Class.forName(...).newInstance()
 *有参构造:
 *1.获取有参构造方法的Constructor对象
 *    Class clazz = Class.forName("cn.zzsxt.entity.Student");
    Constructor constructor = clazz.getDeclaredConstructor(String.class,int.class,double.class
  2.调用newInsatnce(Object...objs)方法创建对象
    Object obj = constructor.newInstance("zhangsan",23,80);
 */
public class TestConstructor {
    public static void main(String[] args) throws Exception{
//        Student student = new Student();
//        Class.forName("cn.zzsxt.entity.Student").newInstance();//相当于调用无参构造函数创建对象
//        Student student = new Student("zhangsan",23,80);
        Class clazz = Class.forName("cn.zzsxt.entity.Student");
        Constructor constructor = clazz.getDeclaredConstructor(String.class,int.class,double.class);
        Object obj = constructor.newInstance("zhangsan",23,80);
        System.out.println(obj);
    }
    
}
/**
 * java.lang.reflect.Field类:Field提供有关类或接口的单个字段的信息,以及对它的动态访问权限。
 *  getName():获取属性名称
 *  getType():获取属性类型
 *  getModifies():获取修饰符
 *  set(Object obj, Object value) 将指定对象变量上此 Field 对象表示的字段设置为指定的新值。
 *  get(Object obj) 返回指定对象上此 Field 表示的字段的值。
 */
public class TestField {
    public static void main(String[] args) throws Exception{
//        Student student = new Student();
//        student.setName("zhangsan");
//        student.getName();
        Class clazz = Class.forName("cn.zzsxt.entity.Student");
        Object obj = clazz.newInstance();  
        Field field = clazz.getDeclaredField("name");
        field.setAccessible(true);//设置访问控制,true为可以访问private修饰的属性
        field.set(obj, "zhangsan");//赋值
        System.out.println(field.get(obj));//取值
    }
    
}
/**
 * java.lang.reflect.Method类:Method 提供关于类或接口上单独某个方法(以及如何访问该方法)的信息
 * getModifiers() :获取修饰符
 * getReturnType():获取返回值类型
 * getName():获取方法名
 * getParameterTypes():获取方法的参数列表类型
 * getExceptionTypes():获取异常类型
 * 
 * invoke(Object obj, Object... args) ***:对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。  
 * 
 */
public class TestMethod {
    public static void main(String[] args) throws Exception{
//        Student student = new Student();
//        student.setName("zhangsan");
//        student.getName();
        Class clazz = Class.forName("cn.zzsxt.entity.Student");
        Object obj = clazz.newInstance();
        Method setterMethod = clazz.getMethod("setName", String.class);
        //回调方法student.setName("zhangsan")
        setterMethod.invoke(obj, "zhangsan");//第一个参数为对象,第二个参数为方法的参数值
        Method getterMethod =clazz.getMethod("getName", null);
        //回调方法:student.getName();
        Object result = getterMethod.invoke(obj, null);
        System.out.println(result);
    }
    
}
public class Student implements Serializable {
    private String name;
    private int age;
    private double score;
    
    public Student() {
        
    }
    
    public Student(String name, int age, double score) {
        this.name = name;
        this.age = age;
        this.score = score;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public double getScore() {
        return score;
    }
    public void setScore(double score) {
        this.score = score;
    }

    @Override
    public String toString() {
        return "Student [name=" + name + ", age=" + age + ", score=" + score + "]";
    }
    
}
public class User implements Serializable{
    private int userId;
    private String userName;
    private String userPass;
    
    public User(){
        
    }
    public User(int userId,String userName,String userPass){
        this.userId=userId;
        this.userName=userName;
        this.userPass=userPass;
    }
    
    public int getUserId() {
        return userId;
    }
    public void setUserId(int userId) {
        this.userId = userId;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getUserPass() {
        return userPass;
    }
    public void setUserPass(String userPass) {
        this.userPass = userPass;
    }
    
}
public class MyHibernate {
    /**
     * User user = new User(1,"zhangsan","123");
     * insert into User(userId,userName,userPass) values('1','zhangsan','123');
     * save(user)
     * @param obj
     */
    public static void save(Object obj) throws Exception{
        StringBuffer sb = new StringBuffer("insert into ");
        Class clazz = obj.getClass();
        String className = clazz.getSimpleName();
        sb.append(className+"(");// insert into User (
        Field[] fs = clazz.getDeclaredFields();//获取所有的属性信息
        for (Field field : fs) {
            String fieldName = field.getName();
            sb.append(fieldName+",");
        }//insert into User(userId,userName,userPass,
        sb.replace(sb.length()-1, sb.length(), ")");//insert into User(userId,userName,userPass)
        sb.append("values (");//insert into User(userId,userName,userPass) values (
        for (Field field : fs) {
            String  fieldName = field.getName();//属性名称
            String getterMethodName = makeGetter(fieldName);//根据属性名称获取getter方法名
            Method getterMethod = clazz.getDeclaredMethod(getterMethodName, null);//获取该属性对应getter方法
            Object value = getterMethod.invoke(obj, null);//回调getter方法获取对应的属性值
            sb.append("'"+value+"',");
        }//insert into User(userId,userName,userPass) values('1','zhangsan','123',
        sb.replace(sb.length()-1, sb.length(), ")");//insert into User(userId,userName,userPass) values('1','zhangsan','123')
        System.out.println(sb);
    }
    /**
     * 根据属性名称生成对应的getter方法名: get+属性的第一个字母大写+其余字母
     * @param fieldName  userId userName
     * @return   getUserId   getUserName
     */
    public static String makeGetter(String fieldName){
        return "get"+fieldName.substring(0, 1).toUpperCase()+fieldName.substring(1);
    }
    
    public static void main(String[] args) throws Exception {
        User user = new User(2,"lisi","123");
        MyHibernate.save(user);
        Student stu = new Student(1,"wangwu",23);
        MyHibernate.save(stu);
    }
    
}
public class Student implements Serializable{
    private int stuId;
    private String stuName;
    private int stuAge;
    
    public Student(int stuId, String stuName, int stuAge) {
        super();
        this.stuId = stuId;
        this.stuName = stuName;
        this.stuAge = stuAge;
    }

    public Student(){
        
    }

    public int getStuId() {
        return stuId;
    }

    public void setStuId(int stuId) {
        this.stuId = stuId;
    }

    public String getStuName() {
        return stuName;
    }

    public void setStuName(String stuName) {
        this.stuName = stuName;
    }

    public int getStuAge() {
        return stuAge;
    }

    public void setStuAge(int stuAge) {
        this.stuAge = stuAge;
    }
    
}
public interface Servlet {
    public void service();
}
/**
 * 用于封装web.xml中的servlet节点的信息
 * @author Administrator
 *
 */
public class ServletBean {
    private String name;//封装servlet-name的值
    private String clazz;//封装servlet-class的值
    
    public ServletBean(String name, String clazz) {
        super();
        this.name = name;
        this.clazz = clazz;
    }
    
    public ServletBean() {
        super();
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getClazz() {
        return clazz;
    }
    public void setClazz(String clazz) {
        this.clazz = clazz;
    }
    
}
public class IndexServlet implements Servlet {

    @Override
    public void service() {
        System.out.println("欢迎访问主页!");
    }

}
public class LoginServlet implements Servlet {

    @Override
    public void service() {
        System.out.println("用户登陆的service方法....");
    }

}
public class LogoutServlet implements Servlet {

    @Override
    public void service() {
        System.out.println("用户退出登陆的service方法....");
    }

}
public class XMLUtils {
    /**
     * 解析指定的XML,并将解析的结果保存到Map中返回,
     * 以配置文件的servlet-name中的文本做键,以配置文件servlet-class文本做值
     * @param file
     * @return
     */
    public static Map<String,String> paserXML(File file){
        Map<String,String> map = new HashMap<String,String>();//保存解析的web.xml中节点信息,用servlet-name做键,用servlet-class做值
        SAXReader saxReader = new SAXReader();
        try {
            Document document = saxReader.read(file);
            Element root = document.getRootElement();//获取web.xml中的根节点 webapps
            Iterator<Element> serlvetIter=  root.elementIterator();//获取根节点的子节点迭代器
            while(serlvetIter.hasNext()){
                ServletBean servletBean = new ServletBean();
                Element servletEle = serlvetIter.next();//获取servlet节点
                Iterator<Element> servletChildIter = servletEle.elementIterator();
                while(servletChildIter.hasNext()){
                    Element childEle = servletChildIter.next();//获取servlet的子节点 servlet-name, servlet-class
                    String elementName = childEle.getName();//获取元素的名称
                    String text = childEle.getText();
                    if("servlet-name".equals(elementName)){
                        servletBean.setName(text);
                    }else{
                        servletBean.setClazz(text);
                    }
                }
                map.put(servletBean.getName(), servletBean.getClazz());
            }
        } catch (DocumentException e) {
            e.printStackTrace();
        }
        return map;
    }
    
    public static void main(String[] args) {
        Map map = paserXML(new File("web.xml"));
        System.out.println(map);
    }
}
public class Test {
    /**
     * 违反了"开闭原则"
     * "开":对扩展要"开"--->程序应该容易扩展
     * "闭":对修改要"闭"--->尽可能少的修改代码或不修改代码
     */
    public static void main(String[] args) {
        Map<String,String> map = XMLUtils.paserXML(new File("web.xml"));
        System.out.println("请输入需要访问的Servlet名称");
        Scanner input = new Scanner(System.in);
        String servletName = input.nextLine();
//        if("LoginServlet".equals(servletName)){
//            LoginServlet loginServlet = new LoginServlet();
//            loginServlet.service();
//        }else if("LogoutServlet".equals(servletName)){
//            LogoutServlet logoutServlet = new LogoutServlet();
//            logoutServlet.service();
//        }else if("IndexServlet".equals(servletName)){
//            IndexServlet indexServlet = new IndexServlet();
//            indexServlet.service();
//        }
        String serlvetClass = map.get(servletName);
        //通过反射机制创建对象
        try {
            Servlet servlet = (Servlet)Class.forName(serlvetClass).newInstance();
            servlet.service();//多态
        } catch (Exception e) {
            e.printStackTrace();
        }
        
    }
}
原文地址:https://www.cnblogs.com/fwdsz/p/6821079.html