10、Class类的构造器:Constrctor、Class类的属性:field、Class类的方法:Method

来源:互联网 发布:c语言switch语句应用 编辑:程序博客网 时间:2024/05/08 04:37

Constrctor

得到某个类所有的构造方法:
例子 
Constructor[] constructor = Class.forName("java.lang.String").getConstructor();
得到某一个构造方法:
例子 
Constructor constructor = Class.forName("java.lang.String").getConstructor(StringBuffer.class);
创建实例对象:
通常方式:String str = new String(new StringBuffer("abc"));
放射方式:String str = (String)constructor.forName("java.lang.String").newInstance(new StringBuffer("abc"));
Class.newInstance()方法:
例子 
String obj =(String)Class.forName("java.lang.String").newInstance();
该方法内部先得到默认的构造方法,然后用该构造方法创建实例对象。
改方法内部的具体代码是怎么样写的呢?用到了缓存机制来保存默认构造方法的实例对象。

package ConstructorPackage;import java.lang.reflect.Constructor;public class Test01 {public static void main(String[] args)throws Exception{try {Constructor con = String.class.getConstructor(StringBuffer.class);String str = (String)con.newInstance(new StringBuffer("asdad"));System.out.println(str.charAt(2));}catch (NoSuchMethodException e){e.printStackTrace();} catch (SecurityException e) {e.printStackTrace();}}}



field

package FieldPackage;import java.lang.reflect.Field;public class Demo2 {public static void main(String[] args) throws Exception{ReflexPoint pt1 = new ReflexPoint(3,4);Field fieldY = pt1.getClass().getField("y");System.out.println(fieldY.get(pt1));//getDeclaredField 只要是类里面有声明 不管是否是私有 ,一律获取到Field fieldX = pt1.getClass().getDeclaredField("x");//暴力反射 fieldX.setAccessible(true);System.out.println(fieldX.get(pt1));}}class ReflexPoint{private int x;    public int y;    public String str1;    public String str2;    ReflexPoint(int x, int y)    {        this.x = x;        this.y = y;    }   ReflexPoint(String str1, String str2)    {    this.str1 = str1;    this.str2 = str2;    }    public String toString()    {        return str1+" "+str2;    }   }



Method

1、获取类的方法的数组:
Method[] methods2 = clazz.getDeclaredMethods();
2、获取类指定的方法:
Method method = clazz.getMethod("setName", String.class);
​注释:
setName:方法名
String.class:方法的参数类型(使用class来描述)的列表
3、通过Method对象执行方法:
public Object invoke(Object obj,Object... args)
​注释:
obj:执行哪个对象的方法
args:执行方法时需要传入的参数
Object obj =clazz.newInstance();
method.invoke(obj,"胡平燕",25);

package MethodPackage;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;public class ReflexTest2 {//成员方法的反射public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException{Class clazz = null;try{clazz = Class.forName("Person");} catch (ClassNotFoundException e) {e.printStackTrace();}//1、获取clazz中除private私有外的所有方法Method[] methods1 = clazz.getMethods();for(Method m : methods1){System.out.println("^^"+m.getName());}//2、获取clazz中当前类声明的所有方法 ,包括privateMethod[] methods2 = clazz.getDeclaredMethods();for(Method m : methods2){System.out.println("**"+m.getName());}//3、获取clazz类中指定的方法Method method = null;try {method = clazz.getMethod("setName", String.class);} catch (NoSuchMethodException e) {e.printStackTrace();} catch (SecurityException e) {e.printStackTrace();}System.out.println("++"+method.getName());try {method = clazz.getMethod("setName", String.class,int.class);} catch (NoSuchMethodException e) {e.printStackTrace();} catch (SecurityException e) {e.printStackTrace();}System.out.println("++"+method.getName());//4、执行方法Object obj = null;try {obj = clazz.newInstance();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}method.invoke(obj,"胡平燕",25);}}


0 0
原创粉丝点击