java 反射

一.

  • 反射机制:用来检查可用方法,并返回方法名。
  • Class类和java.lang.reflect类库对反射提供了支持 点击查看
get() 和 set()  //读取和修改与Field对象关联的字段
invoke()方法调用与Method对象关联的方法
getFields() ,getMethods(), getConstructor() 分别返回表示字段,方法构造器的对象的数组
  1. reflect包中有Field类,Method类,Constructor类,这些类对象由jvm在运行时创建,用来表示未知类里的字段,方法,构造器。
  2. 使用Constructor创建新对象,Filed的get() set()方法修改Filed对象关联的字段,Class类的invoke()调用Method关联的方法。
  3. 调用Class类的getFileds()返回表示字段的Filed数组,getMethods()返回表示方法的Method数组,getConstructor()返回表示构造器的Constructor数组。
  4. 通过以上方法一个匿名对象的类信息便可在运行时被确定下来,再在运行时通过.class文件获得相关信息构造该类。
  5. 没有任何方法可以阻止反射调用那些非公共访问权限的方法,哪怕是private方法或者private域。

二.类方法提取器

下面是一个可以自动展示完整接口的工作方式

 

package typeinfo;
//: typeinfo/ShowMethods.java
// Using reflection to show all the methods of a class,
// even if the methods are defined in the base class.
// {Args: ShowMethods}
import java.lang.reflect.*;
import java.util.regex.*;
import static net.mindview.util.Print.*;

public class ShowMethods {
  private static String usage =
    "usage:\n" +
    "ShowMethods qualified.class.name\n" +
    "To show all methods in class or:\n" +
    "ShowMethods qualified.class.name word\n" +
    "To search for methods involving 'word'";
  private static Pattern p = Pattern.compile("\\w+\\.");
  public static void main(String[] args) {
    if(args.length < 1) {
      print(usage);
      System.exit(0);
    }
    int lines = 0;
    try {
      Class<?> c = Class.forName(args[0]);
      Method[] methods = c.getMethods();
      Constructor[] ctors = c.getConstructors();
      if(args.length == 1) {
        for(Method method : methods)
          print(
            p.matcher(method.toString()).replaceAll(""));
        for(Constructor ctor : ctors)
          print(p.matcher(ctor.toString()).replaceAll(""));
        lines = methods.length + ctors.length;
      } else {
        for(Method method : methods)
          if(method.toString().indexOf(args[1]) != -1) {
            print(
              p.matcher(method.toString()).replaceAll(""));
            lines++;
          }
        for(Constructor ctor : ctors)
          if(ctor.toString().indexOf(args[1]) != -1) {
            print(p.matcher(
              ctor.toString()).replaceAll(""));
            lines++;
          }
      }
    } catch(ClassNotFoundException e) {
      print("No such class: " + e);
    }
  }
} /* Output:
public static void main(String[])
public native int hashCode()
public final native Class getClass()
public final void wait(long,int) throws InterruptedException
public final void wait() throws InterruptedException
public final native void wait(long) throws InterruptedException
public boolean equals(Object)
public String toString()
public final native void notify()
public final native void notifyAll()
public ShowMethods()
*///:~

 三.Constructor类的方法

public Type[] getParameterTypes() //返构造器的参数类型的数组,如果没有返回的Type长度为0
public  Constructor <?> [] getConstructors() //返回一个数组,其中包含Constructor反映此Class对象所表示的类的所有公共构造函数的 对象。如果类没有公共构造函数,或者类是数组类,或者类反映了基本类型或void,则返回长度为0的数组
 
package ch22;

import java.lang.reflect.*;

class Test{
    public final int c;
    public final String s;
    public Test(int c,String n){
        this.c = c;
        this.s = n;
    }
    public String toString(){
        return c + " , " +  s;  
    }
}
public class Fan <T>{
    Class<T> cl;
    public Fan(Class<T> c){
        cl = c;
    }
    public  T create(int args)
    {
        try{
            for(Constructor<?> ctor : cl.getConstructors())
            {
                Class<?>[]  ct = ctor.getParameterTypes();
                if(ct.length == 1)
                    return cl.cast(ctor.newInstance(args));
                if(ct.length == 2)
                    return cl.cast(ctor.newInstance(args,ct[1].newInstance()));
            }
        }catch(Exception e)
        {
            
        }
        return null;
    }
    public static void main(String[] args){
        Fan<Test> f = new Fan<Test>(Test.class);
        Test test = f.create(10);
        if(test == null)
            System.out.println("Can't be installed");
        System.out.println(test);
        Fan<Integer> in = new Fan<Integer>(Integer.class);
        Integer inte = in.create(3);
        if(inte == null)
            System.out.println("Can't be installed");
        System.out.println(inte);
    }
}

 

posted @ 2019-02-07 16:37  江期玉  阅读(213)  评论(0编辑  收藏  举报