关于类的反射相关学习

来源:互联网 发布:便携网络图形图像 编辑:程序博客网 时间:2024/06/02 03:44
一 怎么获取类的实例
1.例子
package com.reflet;/** * Created by wq on 2017/8/18. */class  Student{    private String name;    private  Integer age;/*    public  Student(String name,Integer age){        this.name=name;        this.age=age;        System.out.print("Student类的构造方法");    }*/    @Override    public String toString() {        return "Student类的toString方法";    }}public class ReflectDemo {    public static void main(String args[]) throws ClassNotFoundException, IllegalAccessException, InstantiationException {       Class<?> cls = Class.forName("com.reflet.Student");       Object obj = cls.newInstance();    }}
Object obj = cls.newInstance(); 默认调用的是无参的构造函数
2.获取一个类中全部的构造函数
package com.reflet;import java.lang.reflect.Constructor;/** * Created by wq on 2017/8/18. */public class RefletStringDemo {    public static void  main(String agrs[]) throws ClassNotFoundException {     Class<?> cls = Class.forName("java.lang.String");     //取得全部构造方法        Constructor<?>[] cons = cls.getConstructors();        for (int x=0;x<cons.length;x++){            System.out.println(cons[x]);        }        //?怎么调用指定的构造方法    }}

3.怎样调用指定参数的构造函数呢
Class<?> cls = Class.forName("com.reflet.Student");
//指定参数的类型 Constructor<?> cons = cls.getConstructor(String.class,Integer.class); Object obj =cons.newInstance("TOM",20);

二。怎么调用类之中可以使用的方法呢? 
(1父类继承而来的方法2.本类自定义的方法)
package com.reflet;import java.lang.reflect.Constructor;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;/** * Created by wq on 2017/8/18. */class  Student implements Message{   public void fun(){};   public void print(){}    @Override    public void get() {    }}interface Message{    public void get();}public class ReflectDemo {    public static void main(String args[]) throws ClassNotFoundException, IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchMethodException {       Class<?> cls = Class.forName("com.reflet.Student");
// 取得全部方法 包括继承来的方法        Method met[] =cls.getMethods();        for(int x=0;x<met.length;x++){            System.out.println(met[x]);        }
//只取得本类中的方法        Method meth[] =cls.getDeclaredMethods();        for(int x=0;x<meth.length;x++){            System.out.println(meth[x]);        }    }
}
package com.reflet;import java.lang.reflect.Constructor;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.lang.reflect.Modifier;/** * Created by wq on 2017/8/18. */class  Student implements Message{   public void fun(){};   public void print(){}    @Override    public void get() {    }}interface Message{    public void get();}public class ReflectDemo {    public static void main(String args[]) throws ClassNotFoundException, IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchMethodException {       Class<?> cls = Class.forName("com.reflet.Student");        Method met[] =cls.getMethods();        for(int x=0;x<met.length;x++){            //取得修饰符 返回的是修饰符对应的代码            System.out.print(met[x].getModifiers()+",");            //取得修饰符名称            System.out.print(Modifier.toString( met[x].getModifiers())+",");            //取得返回值的类型名称            System.out.println(met[x].getReturnType().getSimpleName());             Class<?> params[] =met[x].getParameterTypes();                  if(params.length>0){ //表示有参数                      for (int y=0;y<params.length;y++){                          System.out.println(params[y].getSimpleName()+" arg- "+y+",");                          if (y<params.length-1){ //还有参数  就输出逗号                              System.out.println(",");                          }                      }                  }            //取得方法的名称            System.out.print(met[x].getName());            System.out.println();        }        Method meth[] =cls.getDeclaredMethods();        for(int x=0;x<meth.length;x++){            System.out.println(meth[x]);        }    }还有取得异常等等不做描述。。。}


原创粉丝点击