Fork me on GitHub

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;

    }

}

 

 

posted @ 2019-03-02 15:53  小传风  阅读(217)  评论(1编辑  收藏  举报