zoukankan      html  css  js  c++  java
  • Java 反射(简单捋一下)

    有Student类,Person类,还有一个叫Class的类,这是反射的源头。
    正常方式:通过完整的类名 > 通过new实例化 > 取得实例化对象
    反射方式:实例化对象 > getClass()方法 > 通过完整的类名
     
    需要使用反射就要获得Class这个类,有三种方法:
    package cn.classes;
    
    public class OneClass {
    
    }
    import cn.classes.OneClass;
    
    public class Test {
    public static void main(String[] args) {
         Class<?> c1 = null;
         Class<?> c2 = null;
         Class<?> c3 = null;
    
         try{
             // 方法一:forName
             c1 = Class.forName("cn.classes.OneClass");
        } 
        catch (ClassNotFoundException e){
             e.printStackTrace();
        }
         // 方法二
         c2 = new OneClass().getClass();
      
         // 方法三
         c3 = OneClass.class;
    
         System.out.println(c1.getName());
         System.out.println(c2.getName());
         System.out.println(c3.getName());
       }
    }
    
    输出结果:cn.classes.OneClass

    利用Class这个类实例化类

    无参构造

    package cn.classes;
    
    
    public class Person {
        private String name;
        private int age;
    
        // 省略getter setter
    
        @Override
        public String toString(){
              return "Person [name=" + name + ", age=" + age + "]";
        }
    
    }
    
    
    package cn.test;
    
    import cn.classes.Person;
    
    public class Test{
        // 这样做必须在类中有一个空构造方法
        public static void main(String[] args){
                  Class<?> c = null;
                   try{
                          c = Class.forName("cn.classes.Person");
                          Person p = (Person)c.newInstance();
                          p.setName("xy");
                          p.setAge(20);
                          System.out.println(p);
                   } 
                  catch (Exception e){
                          e.printStackTrace();
                   }  
         }
    }

    有参构造

    package cn.classes;
    
    public class Person{
        private String name;
        private int age;
    
         public Person(Stringname,int age){
    
                     this.name = name;
    
                     this.age = age;
    
        }
    
        // 省略getter setter    
    
        @Override
        public String toString(){
              return "Person [name=" + name + ", age=" + age + "]";
        }
    }
    
    
    package cn.test;
    
    import java.lang.reflect.Constructor;
    
    import cn.classes.Person;
    
    public class Test{
        // 若没有一个空构造方法
        public static void main(String[] args) {
              Class<?> c = null;
              try {
                      c = Class.forName("cn.classes.Person");
                      Constructor<?> con = c.getConstructors(String.class,int.class);
                      Person p = (Person)con.newInstance("xy",20);
                      System.out.println(p);
              } 
             catch (Exception e){
                    e.printStackTrace();
             }  
        }
    }

    Class类调用方法

    demo1:

    package cn.classes;
    
    public class Person{
        public void add(){
               System.out.println("add");
        }
    
        public void addWithParameters(String name, int age){
                System.out.println("add带参数方法" + name + age);
        }
    }
    
    
    package cn.test;
    
    import java.lang.reflect.Method;
    
    public class Test{
        public static void main(String[] args){
                 Class<?> c1 = null;
                 try{
    
                       c1 = Class.forName("cn.classes.Person");
    
                       // 不带参数的方法调用
                       Method m = c1.getMethod("add");
                       m.invoke(c1.newInstance());
    
                       // 带参数方法调用
                       Method m1 = c1.getMethod("addWithParameters", String.class, int.class);
                       m1.invoke(c1.newInstance(), "xy", 22);
                }
                catch (Exception e){
                       e.printStackTrace();
                }
        }
    }

    demo2:

    package cn.classes;
    public class Person{
        private String name;
        private int age;
        // 省略getter setter  
     }
    package cn.test;
    import java.lang.reflect.Method;
    public class Test{
        public static void main(String[] args){
               Class<?> c1 = null;
               Object obj = null;
               try{
                         c1 = Class.forName("cn.classes.Person");
                         obj = c1.newInstance();
                         setter(obj, "name", "xy", String.class);
                         setter(obj, "age", 20, int.class);
                         getter(obj, "name");
                         getter(obj, "age");
               }
               catch (Exception e){
                        e.printStackTrace();
                }
       }
       /**
        * @param obj:要操作的对象
        * @param att:要操作的属性
        * @param value:要设置的属性内容
        * @param type:要设置的属性类型
        */
        public static void setter(Object obj, String att, Object value, Class<?> type){
             try{
                 // 得到setter方法
                 Method m = obj.getClass().getMethod("set" + initStr(att), type);
                 m.invoke(obj, value);
             }
             catch (Exception e){
                e.printStackTrace();
             }
       }
       /**
        * @param obj:要操作的对象
        * @param att:要操作的属性
        */
       public static void getter(Object obj, String att){
            try{
                   // 得到getter方法
                   Method m = obj.getClass().getMethod("get" + initStr(att));
                   System.out.println(m.invoke(obj));
            }
           catch (Exception e){
                   e.printStackTrace();
           }
       }
        /**
         * 首字母大写
         * @param oldStr
         * @return
         */
    
        public static String initStr(String oldStr) {
    
            String newStr = oldStr.substring(0, 1).toUpperCase() + oldStr.substring(1);
    
            return newStr;
    
        }
    
    }
  • 相关阅读:
    mysql5.7慢查询开启配置
    easyui的datagrid删除一条记录后更新出问题
    easyui跨iframe属性datagrid
    struts2笔记12-声明式异常
    struts2笔记11-OGNL
    struts2笔记10-值栈
    linux命令学习03-grep
    struts2笔记09-动态方法调用
    1、GIT简介
    玩转Python语言之4:奇技淫巧
  • 原文地址:https://www.cnblogs.com/xiaozhuanfeng/p/10461418.html
Copyright © 2011-2022 走看看