JavaEE企业开发新技术3

目录

[2.11 Method的基本操作-1](#2.11 Method的基本操作-1)

文字性概念描述

代码:

[2.12 Method的基本操作-2](#2.12 Method的基本操作-2)

[2.13 Method的基本操作-3](#2.13 Method的基本操作-3)

[2.14 数组的反射操作-1](#2.14 数组的反射操作-1)

文字性概念:

代码:

[2.15 数组的反射操作-2](#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表示。

代码:
java 复制代码
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()方法");

}

测试类:

java 复制代码
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

java 复制代码
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);

}

java 复制代码
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);

}

}

java 复制代码
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用于完成对数组的反射操作。

代码:
java 复制代码
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

java 复制代码
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);
		}
	}

测试类:

java 复制代码
String[] strs= {"计算机科学与技术","软件工程","物联网工程"};
		int[][] a= {{1,2},{3,4}};
		
		String[][] str2= {{"计算机科学与技术","软件工程","物联网工程"},{"计算机科学与技术1","软件工程1","物联网工程1"}};
		
		p.printArrayElements(str2);
相关推荐
考虑考虑13 小时前
Jpa使用union all
java·spring boot·后端
用户37215742613514 小时前
Java 实现 Excel 与 TXT 文本高效互转
java
浮游本尊15 小时前
Java学习第22天 - 云原生与容器化
java
佛祖让我来巡山16 小时前
深入理解JVM内存分配机制:大对象处理、年龄判定与空间担保
jvm·内存分配·大对象处理·空间担保·年龄判定
渣哥17 小时前
原来 Java 里线程安全集合有这么多种
java
间彧17 小时前
Spring Boot集成Spring Security完整指南
java
间彧17 小时前
Spring Secutiy基本原理及工作流程
java
Java水解18 小时前
JAVA经典面试题附答案(持续更新版)
java·后端·面试
洛小豆20 小时前
在Java中,Integer.parseInt和Integer.valueOf有什么区别
java·后端·面试
前端小张同学21 小时前
服务器上如何搭建jenkins 服务CI/CD😎😎
java·后端