反射机制还可以调用类中的指定方法或指定属性,并且可以通过反射完成对数组的操作。
通过反射调用类中的方法
import java.lang.reflect.Method; //=================================================
// File Name : InvokeChina_demo
//------------------------------------------------------------------------------
// Author : Common //主类
//Function : InvokeChina_demo;
public class InvokeChina_demo { public static void main(String[] args) {
// TODO 自动生成的方法存根
Class<?> c1 = null; //指定泛型
try{
c1 = Class.forName("Person_5"); //传入要实例化类的完整包.类名称
}catch(ClassNotFoundException e){
e.printStackTrace();
}
try{
Method met = c1.getMethod("sayChina"); //取得一个Method对象
met.invoke(c1.newInstance()); //使用invoke进行调用,必须传递对象实例
}catch(Exception e){
e.printStackTrace();
}
} }
可以向方法中传递两个参数
import java.lang.reflect.Method; //=================================================
// File Name : InvokeChina_demo
//------------------------------------------------------------------------------
// Author : Common //主类
//Function : InvokeChina_demo;
public class InvokeChina_demo { public static void main(String[] args) {
// TODO 自动生成的方法存根
Class<?> c1 = null; //指定泛型
try{
c1 = Class.forName("Person_5"); //传入要实例化类的完整包.类名称
}catch(ClassNotFoundException e){
e.printStackTrace();
}
try{ Method met = c1.getMethod("sayHello",String.class,int.class); //此方法需要两个参数
String rv = null; //接收方法的返回值
rv = (String)met.invoke(c1.newInstance(),"李四",32); //使用invoke进行调用,必须传递对象实例
System.out.println(rv);
}catch(Exception e){
e.printStackTrace();
}
} }
调用setter和getter方法
import java.lang.reflect.Method; //=================================================
// File Name : InvokeSetGet_demo
//------------------------------------------------------------------------------
// Author : Common //主类
//Function : InvokeSetGet_demo;
public class InvokeSetGet_demo { public static void main(String[] args) {
// TODO 自动生成的方法存根
Class<?> c1 = null; //指定泛型
Object obj = null; //声明一个对象
try{
c1 = Class.forName("Person_5"); //传入要实例化类的完整包.类名称
}catch(ClassNotFoundException e){
e.printStackTrace();
}
try{
obj = c1.newInstance(); //实例化操作对象
}catch(InstantiationException | IllegalAccessException e){
e.printStackTrace();
} setter(obj, "name", "张三", String.class);
setter(obj, "age", 25, int.class);
System.out.println("姓名:");
getter(obj, "name");
System.out.println("年龄:");
getter(obj, "age");
} public static void setter(Object obj,String att,Object value,Class<?> type){
try{
Method met = obj.getClass().getMethod("set"+initStr(att),type); //设置方法参数类型
met.invoke(obj, value); //调用方法
}catch(Exception e){
e.printStackTrace();
}
} public static void getter(Object obj,String att){
try{
Method met = obj.getClass().getMethod("get"+initStr(att));
System.out.println(met.invoke(obj)); //接收方法的返回值
}catch(Exception e){
e.printStackTrace();
}
} public static String initStr(String old){
String str = old.substring(0, 1).toUpperCase()+old.substring(1); //首字母大写
return str; } }
直接操作类中的属性
import java.lang.reflect.Field; //=================================================
// File Name : InvokeField_demo
//------------------------------------------------------------------------------
// Author : Common //主类
//Function : InvokeField_demo;
public class InvokeField_demo { public static void main(String[] args) throws Exception {
// TODO 自动生成的方法存根
Class<?> c1 = null; //声明Class对象
Object obj = null; //声明一个对象 c1 =Class.forName("Person_5"); //实例化Class对象
obj = c1.newInstance(); //实例化对象 Field nameField = null; //表示name属性
Field ageField = null; //表示age属性
nameField = c1.getDeclaredField("name"); //取得name属性
ageField = c1.getDeclaredField("age"); //取得age属性 nameField.setAccessible(true); //将name属性设置成可被外部访问
nameField.set(obj, "张三"); //设置name属性内容
ageField.setAccessible(true); //将age属性设置成可被外部访问
ageField.set(obj, 33); //设置age属性内容 System.out.println("姓名:"+nameField.get(obj)); //通过get取得属性内容
System.out.println("年龄:"+ageField.get(obj));
} }
通过反射操作数组
import java.lang.reflect.Field;
import java.lang.reflect.Array; //=================================================
// File Name : InvokeField_demo
//------------------------------------------------------------------------------
// Author : Common //主类
//Function : InvokeField_demo;
public class InvokeField_demo { public static void main(String[] args) throws Exception {
// TODO 自动生成的方法存根 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,6); //修改第一个内容
System.out.println("第一个内容:"+Array.get(temp,0)); //得到第一个内容
} }