zoukankan      html  css  js  c++  java
  • 反射

    /**
     *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();
            }
            
        }
    }
  • 相关阅读:
    C# WM_NCMOUSELEAVE 消息触发
    C#常用集合的使用(转载)
    关于直播,所有的技术细节都在这里了(转载)
    C# Winform 窗体美化
    正则表达式符号全解析
    C#中List<T>转DataTable
    C#中的Queue集合
    C#中Stack集合
    智能信息处理
    Mysql
  • 原文地址:https://www.cnblogs.com/fwdsz/p/6821079.html
Copyright © 2011-2022 走看看