感兴趣的小伙伴可以先看看我的这篇文章哦,打开看看,说不定能帮到你一些~~
2021.10.1日晚
更新慢了,实在抱歉,一天改了太多bug,晚上累到不想动,然而却得知这个作业的截止时间和实验报告不同,于是立马爬起来写了这两题。其实写起来倒挺快,没花多少时间就写出了两题大致代码。但是这两题我都遇到了让我十分无语的bug,改来改去改了好久都是错。好在我没有放弃,不断的调试,最终还是解决了让我头疼的bug,不过好像还是有那么一点点小问题,但是实在不想改了,大体上题目的要求还是完成了的。(嘿嘿)
废话不多说,上题。
更新于2021.10.2日早
睡了一觉感觉第一题题目没看清,仔细一看真的写错了,特地重写了一下,实在抱歉(捂脸)
1 . 定义一个类 User,用户类
其中有 4 种访问权限限定符的成员方法, 每一个方法,输出能区分其它方法信息一种方法是 void
一种返回基本类型
一种返回 string
一种返回自定义类
参数分别个数分别是 0,1,2,还有一个是可变参数
输出全部的方法定义
写方法调用的通用方法,要至少能处理基本类型,字符串
实现代码:
package com.zhangyufan.reflect;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
public class TestMethod {
public static void main(String[] args)
throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
Class c = User.class;
Method[] ma = c.getDeclaredMethods();
for (int i = 0; i < ma.length; i++) {
System.out.println("-----------------------------------------------------------------------");
System.out.println(Modifier.toString(ma[i].getModifiers()));
System.out.println(ma[i].getReturnType());
System.out.print(ma[i].getName() + "(");
Class[] mparas = ma[i].getParameterTypes();
if (!ma[i].isAccessible()) {
ma[i].setAccessible(true);
}
for (int j = 0; j < mparas.length; j++) {
System.out.print(mparas[j].getName());
if (j < mparas.length - 1) {
System.out.print(",");
}
}
System.out.print(")");
System.out.println("{};");
Object[] os = new Object[mparas.length];
for (int j = 0; j < mparas.length; j++) {
String name = mparas[j].getName();
if ("java.lang.String".equals(name)) {
os[j] = "小红";
}
if ("int".equals(name)) {
os[j] = 20;
}
if ("[Ljava.lang.String;".equals(name)) {
os[j] = new String[] { "小李", "小王", "小陈" };
}
}
User u = new User();
ma[i].invoke(u, os);
}
}
}
class User {
private String name = "小明";
private int age = 25;
public void method1() {
System.out.println("调用方法1,访问权限限定符为public,该方法是void,参数个数为0");
}
protected int method2(int i) {
System.out.println("调用方法2,访问权限限定符为protected,该方法返回基本类型int,参数个数为1");
return 0;
}
private String method3(String s, int t) {
System.out.println("调用方法3,访问权限限定符为private,该方法返回String,参数个数为2");
return "";
}
User method4(String... names) {
System.out.println("调用方法4,访问权限限定符为default,该方法返回自定义类,参数为可变参数");
return new User();
}
}
运行结果:
- 定义一个类,其中有 4 种访问权限限定符的成员变量, 基本类型和引用类型各二种,并置初值
输出全部属性定义
使用反射的方式,打印各个成员变量的初值,并重置变量的值
实现代码:
package com.zhangyufan.reflect;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.Arrays;
public class TestField {
public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException {
Class c = Person.class;
Person p = new Person();
Field[] f = c.getDeclaredFields();
for (int i = 0; i < f.length; i++) {
System.out.println("---------------第" + (i + 1) + "个属性---------------");
Class<?> t = f[i].getType();
System.out.print(Modifier.toString(f[i].getModifiers()) + " ");
System.out.print(t + " ");
System.out.println(f[i].getName());
if (!f[i].isAccessible()) {
f[i].setAccessible(true);
}
Object value = f[i].get(p);
if (value.getClass().isArray()) {
double[] a = (double[]) value;
System.out.println("初值:" + Arrays.toString(a));
} else {
System.out.println("初值:" + f[i].get(p));
}
switch (t.toString()) {
case "class java.lang.String":
f[i].set(p, "小陈");
break;
case "int":
f[i].setInt(p, 35);
break;
case "class [D":
f[i].set(p, null);
break;
case "float":
f[i].setFloat(p, 80);
break;
}
System.out.println("重置后值:" + f[i].get(p));
}
}
}
class Person {
private String name = "小明";
protected double[] d = { 1.0, 2.0, 3.0, 4.0, 5.0 };
public int age = 20;
float weight = 70;
}
运行结果: