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);
相关推荐
爬山算法2 分钟前
Maven(6)如何使用Maven进行项目构建?
java·maven
.生产的驴5 分钟前
Electron Vue框架环境搭建 Vue3环境搭建
java·前端·vue.js·spring boot·后端·electron·ecmascript
wjs20249 分钟前
Chrome 浏览器:现代网络浏览的先锋
开发语言
爱学的小涛13 分钟前
【NIO基础】基于 NIO 中的组件实现对文件的操作(文件编程),FileChannel 详解
java·开发语言·笔记·后端·nio
吹老师个人app编程教学14 分钟前
详解Java中的BIO、NIO、AIO
java·开发语言·nio
爱学的小涛14 分钟前
【NIO基础】NIO(非阻塞 I/O)和 IO(传统 I/O)的区别,以及 NIO 的三大组件详解
java·开发语言·笔记·后端·nio
北极无雪19 分钟前
Spring源码学习:SpringMVC(4)DispatcherServlet请求入口分析
java·开发语言·后端·学习·spring
琴智冰22 分钟前
SpringBoot
java·数据库·spring boot
binqian23 分钟前
【SpringSecurity】基本流程
java·spring
AI视觉网奇41 分钟前
pymeshlab 学习笔记
开发语言·python