15.4 Java反射机制的深入应用
15.4.1通过反射调用类中的方法
Method met = c.getMethod("sayChina");
met.invoke(c.newInstance());
【例15.14】调用Person类中的sayChina()方法
public class demo {
public static void main(String[] args) throws Exception
{
Class<?> c = null;
try
{
c = Class.forName("file.Person");//实例化Class
}
catch (ClassNotFoundException e)
{
e.printStackTrace();
}
try
{
Method met = c.getMethod("sayChina");
met.invoke(c.newInstance());
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
【例15.15]调用Person类中的sayHello()方法
public class demo {
public static void main(String[] args) throws Exception
{
Class<?> c = null;
try
{
c = Class.forName("file.Person");//实例化Class
}
catch (ClassNotFoundException e)
{
e.printStackTrace();
}
try
{
Method met = c.getMethod("sayHello",String.class,int.class);
String str = (String)met.invoke(c.newInstance(),"李四",30);
System.out.println(str);
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
15.4.2 调用 setter 及 getter 方法
【例15.16]调用setter及getter方法
setter(Object obj,String att,Object value,Class<?> type)
getter(Object obj,String att)
为什么是Object类型,方便传入不同的实例对象,不同类型的数值
public class demo {
public static void main(String[] args) throws Exception
{
Class<?> c = null;
try
{
c = Class.forName("file.Person");//实例化Class
}
catch (ClassNotFoundException e)
{
e.printStackTrace();
}
Object obj = null;
try
{
obj = c.newInstance();
}
catch (Exception e)
{
e.printStackTrace();
}
setter(obj,"name","李华",String.class);
setter(obj,"age",22,int.class);
System.out.print("name:");
getter(obj,"name");
System.out.print("age:");
getter(obj,"age");
}
public static void setter(Object obj,String att,Object value,Class<?> type)
{
try
{
Method met = obj.getClass().getMethod("set"+sub(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"+sub(att));
System.out.println(met.invoke(obj));
}
catch (Exception e)
{
e.printStackTrace();
}
}
public static String sub(String att)
{
return att.substring(0, 1).toUpperCase() + att.substring(1);
}
}
15.4.3通过反射操作属性
public class demo {
public static void main(String[] args) throws Exception
{
Class<?> c = null;
try
{
c = Class.forName("file.Person");//实例化Class
}
catch (ClassNotFoundException e)
{
e.printStackTrace();
}
Object obj = null;
try
{
obj = c.newInstance();
}
catch (Exception e)
{
e.printStackTrace();
}
//获取本类属性
Field nameField = c.getDeclaredField("name");
Field ageField = c.getDeclaredField("age");
//设置权限
nameField.setAccessible(true);
ageField.setAccessible(true);
//set
nameField.set(obj,"李四");
ageField.set(obj,32);
//get
System.out.println(nameField.get(obj));
System.out.println(ageField.get(obj));
}
}
15.4.4通过反射操作数组
【例15.18]取得数组信息并修改数组内容
public class demo {
public static void main(String[] args) throws Exception
{
int temp[] = {1,2,3};
Class<?> c = temp.getClass().getComponentType();
System.out.println("类型:"+c.getName());
System.out.println("长度:"+Array.getLength(temp));
System.out.println("第一个:"+Array.get(temp, 0));
Array.set(temp, 0, 11);
System.out.println("第一个:"+Array.get(temp, 0));
}
}
【例15.19]修改数组的大小
Class<?> c = obj.getClass();//Class实例
Class<?> arr = c.getComponentType();//array实例
//getComponentType()作用:返回数组类型
public class demo {
public static void main(String[] args) throws Exception
{
int temp[] = {1,2,3};
int newTemp[] = (int[])arrayinc(temp,5) ;
print(newTemp);
System.out.println("----------------------------");
String str[] = {"str1","str2","str3","str4"};
String newstr[] = (String[])arrayinc(str, 8);
print(newstr);
}
public static Object arrayinc(Object obj,int len)
{
Class<?> c = obj.getClass();//Class实例
Class<?> arr = c.getComponentType();//array实例
Object newO = Array.newInstance(arr, len);//实例化新数组(数组类型,长度)
int co = Array.getLength(obj);
System.arraycopy(obj, 0, newO, 0, co);
return newO;
}
public static void print(Object obj)
{
Class<?> c = obj.getClass();
if(!c.isArray())return ;
Class<?> arrtype = c.getComponentType();
int len = Array.getLength(obj);
System.out.println("类型:"+arrtype.getName()+",长度:"+len);
for(int i=0;i<len;i++)
{
System.out.print(Array.get(obj, i)+" ");
}
System.out.println();
}
}