Java反射机制(二)

来源:互联网 发布:恒生估值系统 数据库 编辑:程序博客网 时间:2024/05/18 00:58
Java反射机制的深入应用
1.通过反射调用类中的方法
(1)通过Class类的getMethod(String name,Class...parameterTypes)方法取得一个Method对象,并设置此方法所需要的参数类型
(2)用invoke调用,并向方法中传递设置的参数
范例:
/*
 * 定义一个Person类,其中有name和age属性,say()方法
 */
package com.zgy.reflect;


public class Person 
{
    private String name ;
    private int age;
public String getName() 
{
return name;
}
public void setName(String name) 
{
this.name = name;
}
public int getAge() 
{
return age;
}
public void setAge(int age)
{
this.age = age;
}
    public Person()
    {
   
    }
    public String say(String name,int age)
    {
    return name+"你好,"+age+"年龄";
    }
}






package com.zgy.reflect;




import java.lang.reflect.Method;


public class Invoke 
{
    public static void main(String[] args)
    {
    Class<?> c = null;
    try
    {
    c = Class.forName("com.zgy.reflect.Person");//取得Person类,实例化Class
    }
    catch(ClassNotFoundException e)
    {
    e.printStackTrace();
    }
   
    try 
    {
Method m = c.getMethod("say", String.class,int.class);//获取say()方法,此方法需要两个参数
String str = null;
str = (String)m.invoke(c.newInstance(), "张三",24);//调用invoke()方法,传递一个对象实例和两个参数
System.out.println(str);

    catch (SecurityException e) 
    {
e.printStackTrace();

    catch (NoSuchMethodException e) 
    {
e.printStackTrace();
}
    catch(Exception e)
    {
    e.printStackTrace();
    }
   
    }
}




2.通过反射操作属性
在反射机制中可以使用Filed类操作类中的属性,通过Field类提供的set()方法和get()方法就可以完成设置属性和取得属性的操作。
但是在类中的属性都应该是设置了private属性的,所以在使用Field类的set()和get()方法时,首先要使用Field类中的setAccessible(true)
将要操纵的属性设置为外部可以访问。
(类中的属性应当设置为private,此处只是范例。真是开发中不建议改变属性的访问权限)
package com.zgy.reflect;
/*
 * 定义一个Person类,其中有name和age属性,say()方法
 */


public class Person 
{
    private String name ;
    private int age;
public String getName() 
{
return name;
}
public void setName(String name) 
{
this.name = name;
}
public int getAge() 
{
return age;
}
public void setAge(int age)
{
this.age = age;
}
    public Person()
    {
   
    }
    public String say(String name,int age)
    {
    return name+"你好,"+age+"年龄";
    }
}








package com.zgy.reflect;


import java.lang.reflect.Field;


public class InvokeTest 
{


public static void main(String[] args) 
{
Class<?> c = null;
try
{
c = Class.forName("com.zgy.reflect.Person");//获取Person类的路径,实例化Class类
}
catch(ClassNotFoundException e)
{
e.printStackTrace();
}
try
{
   Object obj = c.newInstance();
   Field fieldName = c.getDeclaredField("name");//取得name属性
   Field fieldAge = c.getDeclaredField("age");//取得age属性
   fieldName.setAccessible(true);//将Name属性设置为外部可以访问
   fieldAge.setAccessible(true);//将age属性设置为外部可以访问
   fieldName.set(obj, "张三");//设置name属性的值为张三
   fieldAge.set(obj, 24);//设置age属性的值为24
   System.out.println("姓名"+fieldName.get(obj));
   System.out.println("年龄"+fieldAge.get(obj));
}
catch(Exception e)
{
e.printStackTrace();
}
}


}










3.通过反射操纵数组
获取数组的Class对象的方法:
public Class<?> getComponentType()
在java.lang.reflect包中,使用Array类表示一个数组。Array类的常用方法:
public static Object get(object array,int index) throws IllegalArgumentException,ArrayIndexOutOfBoundsException//根据下标取得数组内容


public static Object newInstance(Class<?> componentType,int length) throws NegativeArraySizeException//根据已有的数组类型开辟新的数组


public static void set(Object array,int index,Object value) throws IllegalArgumentException,ArrayIndexOutOfBoundsException//修改指定位置内容




范例:
package com.zgy.reflect;


import java.lang.reflect.Array;


public class ClassArray 
{


public static void main(String[] args)
{
int temp[] = {1,2,3};
Class<?> c = temp.getClass().getComponentType();//取得数组的Class对象
System.out.println(c.getName());//取得数组的名称
System.out.println(Array.getLength(temp));//取得数组的长度
System.out.println(Array.get(temp, 0));//取得数组的第一个内容
Array.set(temp, 0, 0);//取得数组的第一个内容
System.out.println(Array.get(temp,0));
}


}








范例:
扩大数组的长度
package com.zgy.reflect;


import java.lang.reflect.Array;


public class ArrayChangeLength 
{


public static void main(String[] args) 
{
int[] arr = {1,2,3,4,5};
int[] newarr = (int[])arrayChange(arr,10);
for(int x : newarr)
{
System.out.print(x+"   ");
}


}

    /*
     * 修改数组长度的方法
     * 方法有2个参数,参数1为原数组,参数2为扩大的长度
     */
public static Object arrayChange(Object obj,int len)
{
Class<?> c = obj.getClass().getComponentType();//得到数组的Class对象
Object newarray = Array.newInstance(c, 10);//开辟新的数组,并指定大小
int lenold = Array.getLength(obj);//取得原数组的长度
System.arraycopy(obj, 0, newarray, 0, lenold);
return newarray;
}


}



0 0
原创粉丝点击