java反射机制 问题

发布于 2021-11-27 18:18:49 字数 180 浏览 817 评论 16

如果有两个类A和B

B继承于A,

A:有字段name    以及getName和setName

B:有AGE   以及get和set方法

怎么使用反射机制获取所有的方法。。并且设置age或者name的值。。。然后调用get方法???

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(16

坏尐絯 2021-12-01 05:40:12

回复
有点长,在下面回复了。

温柔少女心 2021-12-01 05:40:12

原理能讲讲吗???

岁吢 2021-12-01 05:40:12

Java的get方法分两种,boolean类型命名规则是isXxx(字段名首字母大写),其他类型的是getXxx,get方法的参数长度为0。

遍历所有public方法(class.getMethods),根据这两个命名规则就可以把所有get方法找到,当然特殊情况先不考虑。

Java的set方法只有一种,命名规则是setXxx,set方法的参数长度为1,返回值为void。和get方法一样可以把所有set方法找到。

把它们以字段名为键,get、set方法为值放入Map中,这样就可以通过字段名找到对应的方法了,用Method.invoke调用方法即可获取、设置对应的字段值。

筱果果 2021-12-01 05:40:11

你要的是这样的效果?

public class Main {
	public static void main(String[] args) {
		B b = new B();
		DynamicBean d = new DynamicBean(b);
		d.set("name", "abc");
		d.set("age", 1);
		System.out.println(d.get("name"));
		System.out.println(d.get("age"));
	}
	
	public static class A {
		private String name;

		public String getName() {
			return name;
		}

		public void setName(String name) {
			this.name = name;
		}

	}

	public static class B extends A {
		private int age;

		public int getAge() {
			return age;
		}

		public void setAge(int age) {
			this.age = age;
		}

	}
}

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

public class DynamicBean {
	private final Object object;
	private final Map<String, Method> getters = new HashMap<String, Method>();
	private final Map<String, Method> setters = new HashMap<String, Method>();

	public DynamicBean(Object object) {
		this.object = object;
		this.init();
	}

	private void init() {
		for (Method method : object.getClass().getMethods()) {
			String methodName = method.getName();
			if (method.getParameterTypes().length == 0) {
				if (methodName.startsWith("get")) {
					String name = extractName(methodName, "get");
					if (name != null) {
						getters.put(name, method);
					}
				} else if (methodName.startsWith("is")) {
					Class<?> type = method.getReturnType();
					if (type == boolean.class || type == Boolean.class) {
						String name = extractName(methodName, "is");
						if (name != null) {
							getters.put(name, method);
						}
					}
				}
			} else if (method.getParameterTypes().length == 1) {
				if (methodName.startsWith("set")) {
					String name = extractName(methodName, "set");
					if (name != null) {
						setters.put(name, method);
					}
				}
			}
		}
	}

	private String extractName(String methodName, String prefix) {
		String name = methodName.substring(prefix.length());
		if (name.length() == 0
				|| Character.isUpperCase(name.charAt(0)) == false) {
			return null;
		}
		return Character.toLowerCase(name.charAt(0)) + name.substring(1);
	}

	public Object get(String name) {
		try {
			return getters.get(name).invoke(object);
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	public void set(String name, Object value) {
		try {
			setters.get(name).invoke(object, value);
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
}

裸钻 2021-12-01 05:40:06

引用来自“英强”的评论

public class A {

	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

}

public class B extends A {

	private int age;

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
	
	public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
		B b = (B)Class.forName("B").newInstance();
		b.setAge(1);
		b.setName("Cevin");
		
		System.out.println(b.getAge());
		System.out.println(b.getName());
	}
}

看main函数,这能满足你的需求吗?

惜醉颜 2021-12-01 05:40:03

引用来自“英强”的评论

public class A {

	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

}

public class B extends A {

	private int age;

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
	
	public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
		B b = (B)Class.forName("B").newInstance();
		b.setAge(1);
		b.setName("Cevin");
		
		System.out.println(b.getAge());
		System.out.println(b.getName());
	}
}

看main函数,这能满足你的需求吗?

冷清清 2021-12-01 05:40:02

@英强 能举个例子吗???

岁吢 2021-12-01 05:40:02

引用来自“英强”的评论

public class A {

	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

}

public class B extends A {

	private int age;

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
	
	public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
		B b = (B)Class.forName("B").newInstance();
		b.setAge(1);
		b.setName("Cevin");
		
		System.out.println(b.getAge());
		System.out.println(b.getName());
	}
}

看main函数,这能满足你的需求吗?

泛滥成性 2021-12-01 05:39:57

回复
举例子前要有前提,先把前提说明了才行。像你的问题里,如果都知道B这个类了,其实就没必要用反射。

把昨日还给我 2021-12-01 05:39:52

回复
假设不知道有那个方法。。然后反射出set方法。。。然后调用get

奢华的一滴泪 2021-12-01 05:39:10

引用来自“英强”的评论

public class A {

	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

}

public class B extends A {

	private int age;

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
	
	public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
		B b = (B)Class.forName("B").newInstance();
		b.setAge(1);
		b.setName("Cevin");
		
		System.out.println(b.getAge());
		System.out.println(b.getName());
	}
}

看main函数,这能满足你的需求吗?

狠疯拽 2021-12-01 05:33:12

引用来自“英强”的评论

public class A {

	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

}

public class B extends A {

	private int age;

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
	
	public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
		B b = (B)Class.forName("B").newInstance();
		b.setAge(1);
		b.setName("Cevin");
		
		System.out.println(b.getAge());
		System.out.println(b.getName());
	}
}

看main函数,这能满足你的需求吗?

孤独患者 2021-12-01 05:27:06
public class A {

	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

}

public class B extends A {

	private int age;

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
	
	public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
		B b = (B)Class.forName("B").newInstance();
		b.setAge(1);
		b.setName("Cevin");
		
		System.out.println(b.getAge());
		System.out.println(b.getName());
	}
}

看main函数,这能满足你的需求吗?

少女净妖师 2021-12-01 05:23:35

还准备码一下回忆下decleared什么的,有工具就算了…

多彩岁月 2021-12-01 05:02:51

这个是获取值吗???配置文件里面的值???

眼泪淡了忧伤 2021-11-30 22:29:54

1.Class c= Class.forName("B");

 B b = (B)c.newInstance();

2.通过c.getMethod(name,parameterTypes)获得方法,返回的是Method对象(method)

3.调用:method.invoke(b,参数列表)

好像是这样的

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文