目录
2.11 Method的基本操作-1
文字性概念描述
代码:
2.12 Method的基本操作-2
2.13 Method的基本操作-3
2.14 数组的反射操作-1
文字性概念:
代码:
2.15 数组的反射操作-2
- 学习内容
2.11 Method的基本操作-1
文字性概念描述
Method类
Method用来表示类中的方法。通过Class对象的如下方法得到Method对象
Method getMethod(String name, Class<?>... parameterTypes
按名称得到某个特定的public方法(包括从父类或接口继承的方法)
Method[] getMethods()
得到public方法(包括从父类或接口继承的方法)
Methodl getDeclaredMethods()
得到所有的方法(不包括继承的方法)
Method getDeclaredMethod(String name, Class<?>...parameterlypes)
按名称得到某个特定的方法(不包括继承的方法)
得到某个方法对应的Method对象后,需要调用如下方法来在某个对象上执行该方法:
(1)invoke(Object obj,Object ...obj)方法用来调用Method所表示的方法。其中,第一个参数表示此方法作用于哪一个对象。
注意:如果调用的是个静态方法,那么invoke0方法中第一个参数用null表示。
代码:
public abstract class Test3 {
public static void main(String[] args) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
Person p1=new Person();
Class clazz1=p1.getClass();
System.out.println(clazz1==Person.class);
Person p=(Person)clazz1.getConstructor(Integer.class,String.class,String.class,int.class,String.class).newInstance(100,"小明","男",1,"O型血");
Method[] methods=clazz1.getMethods();
for(Method m:methods) {
System.out.println("共有的方法名称是:"+m.getName());
}
}
}
总结:拿到了所有共有的方法,包括从父类继承的方法
Person类中添加缺省的方法
void init() {
System.out.println("Person的init()方法");
}
测试类:
Method[] methods=clazz1.getDeclaredMethods();
for(Method m:methods) {
System.out.println("共有的方法名称是:"+m.getName());
}
总结:运行结果中有init方法,没有拿到从父类继承的方法
Method method1=clazz1.getMethod("getName", null);
System.out.println("得到的方法是:"+method1.getName());
总结:getMethod得到的是指定的方法,第一个参数是得到方法的名称 ,第二个参数是方法带的参数的class类型
Person类加的私有的方法:
private void operation(String message) {
System.out.println(message);
}
Method method2=clazz1.getDeclaredMethod("operation", String.class);
System.out.println("得到的方法是:"+method2.getName());
2.12 Method的基本操作-2
Method method2=clazz1.getDeclaredMethod("operation", String.class);
System.out.println("得到的方法是:"+method2.getName());
//得到Method对象的最终目的还是为了去调用这个方法
method2.setAccessible(true);//如果要执行一个私有的访问权限的方法,调用该方法之前要执行setAccessible方法,设置为true
method2.invoke(p, "这是调用该方法时传递的实际参数");
//静态方法
public static void showMessage(String message) {
System.out.println(message);
}
Method method3=clazz1.getMethod("showMessage", String.class);
System.out.println("得到的方法是:"+method3.getName());
method3.invoke(null, "这是调用静态的showMessage方法");
总结:通过反射的方式调用静态方法,invoke()方法的第一个参数并不和某一个具体的对象所关联起来,所以第一个参数赋为null
2.13 Method的基本操作-3
public void showMessages(String[] strs) {
for(String s:strs) {
System.out.println(s);
}
}
Method method3=clazz1.getMethod("showMessages", String[].class);
System.out.println("得到的方法是:"+method3.getName());
String[] strs= {"你好","咸阳师范学院","计算机学院"};
//调用数组参数的方法时,把整个实际的数组作为一个Object数组的唯一元素进行调用
//method3.invoke(p,new Object[] {strs});
//把实际数组下转成Object对象
method3.invoke(p,(Object)strs);
Object obj=new String[] {"你好","咸阳师范学院","计算机学院"};
//数组也是复合数据类型
2.14 数组的反射操作-1
文字性概念:
在Java中数组属于复合数据类型,具有相同元素类型和维数的数组属于同一个类型,即具有相同的字节码对象。
代表数组的字节码对象调用getsuperClass()得到它的父类Object的字节码对象。
基本数据类型的一维数组可以当做Object类型使用,但不能当做Object[]类型使用;基本数据类型的二维数组可以当做Object[]类型使用;复合数据类型的一维数组既可以当做Object类型使用,也可以当做Object[]类型使用。
java.lang.reflect.Array用于完成对数组的反射操作。
代码:
Object obj1=new int[3];//基本数据类型一维数组可以当作Object使用
//Object[] obj2=new int[4];//基本数据类型一维数组不可以当作Object[]使用
Object[] obj3=new int[4][5];//基本数据类型二维数组可以当作Object[]使用
Object obj4=new String[4];//一维复合数据类型数组当作Object使用
Object[] obj5=new String[4];//一维复合数据类型数组也可以当作Object[]使用
Object[][] obj6=new String[4][5];//二维复合数据类型的数组可以当作 Object,Object[],或者Object[][]使用
int a1[]=new int[6];
int a2[]=new int[100];
//只要维数像扽,类型相等,那么我们就数组的class对象相等(和元素个数无关)
System.out.println(a1.getClass()==a2.getClass());
2.15 数组的反射操作-2
public void printArrayElements(Object obj) {
Class clazz=obj.getClass();
if(clazz.isArray()) { //判断Class类型是否是数组
int length=Array.getLength(obj); //Array类可以对数组进行反射操作
for(int i=0;i<length;i++) {
//System.out.println(Array.get(obj, i));//在某个数组对象上获取下标为i的元素
printArrayElements(Array.get(obj, i)); //递归调用
}
}
else {
System.out.println(obj);
}
}
测试类:
String[] strs= {"计算机科学与技术","软件工程","物联网工程"};
int[][] a= {{1,2},{3,4}};
String[][] str2= {{"计算机科学与技术","软件工程","物联网工程"},{"计算机科学与技术1","软件工程1","物联网工程1"}};
p.printArrayElements(str2);