学会取得类的方法信息,并使用 、学会取得类的属性信息,并使用

感兴趣的小伙伴可以先看看我的这篇文章哦,打开看看,说不定能帮到你一些~~

金陵科技学院软件工程学院软件工程专业

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();
	}
}

运行结果:
在这里插入图片描述

  1. 定义一个类,其中有 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;

}

运行结果:
在这里插入图片描述

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
一、实验目的 1.掌握在Linux系统下利用命令方式实现用户和组的管理; 2.掌握利用Linux-conf进行用户和组的管理; 3.理解文件权限 4.进行系统进程管理。 二、实验内容 1. 用户的管理  创建一个用户user01,设置其主目录为/home/user01:#adduser –d /home/user01 -m user01  查看/etc/passwd文件的最后一行,看看是如何记录的。  查看文件/etc/shadow文件的最后一行,看看是如何记录的。  给用户user01设置密码:#passwd user01。  再次查看文件/etc/shadow文件的最后一行,看看有什么变化。  使用user01用户登录系统,看能否登录成功。。  锁定用户user01:#passwd -l user01。  查看文件/etc/shadow文件的最后一行,看看有什么变化。  再次使用user01用户登录系统,看能否登录成功。  解除对用户user01的锁定:#passwd -u user01  更改用户user01的帐户名为user02:#usermod –l user02 user01。  查看/etc/passwd文件的最后一行,看看有什么变化。  删除用户user02。userdel. 2. 组的管理  创建一个新组,stuff:#groupadd stuff。  查看/etc/group文件的最后一行,看看是如何设置的。  创建一个新帐户user02,并把他的起始组和附属组都设为stuff:#adduser –g stuff –G stuff user02。  查看/etc/group文件中的最后一行,看看有什么变化。  给组stuff设置组密码:#gpasswd stuff。  在组stuff中删除用户user02:#gpasswd –d user02 stuff。  再次查看/etc/group文件中的最后一行,看看有什么变化。  删除组stuff。groupdel 3. 用Linux-conf创建用户和组  进入X-Window图形界面。  打开控制面板,启动用户和组群管理子程序,在打开的界面中练习用户、组的设置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Spiderman_94

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值