反射用JAVA代码怎么实现,下面我用代码解答如何应用,想具体了解的可以查看相关书籍,在这里为了方便起见我就不进行处理了,直接抛异常了哈。
package com.jiaxun.reflect;
//要进行反射的类
public class Person {
String name;
public Person(){
System.out.println("空参构造器");
}
public Person(String name){
this.name = name;
System.out.println("I am "+name);
}
public void eat() {
System.out.println("什么也没吃");
}
public void eat(String fruitName){
System.out.println("吃"+fruitName);
}
public void eat(String name, String fruitName){
System.out.println("我和"+name+"一起吃"+fruitName);
}
public static void staticMethod(){
System.out.println("我是无参数的静态方法。。。");
}
public static void staticMethod(String parameter){
System.out.println("我是有参数的静态方法。。。传入的参数是"+parameter);
}
}
package com.jiaxun.reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
//反射测试类
public class ReflectDemo {
// 获取一个空参数实例并用其调用其方法
public static void test1() throws Exception {
Class clazz = Class.forName("com.jiaxun.reflect.Person");
Person newInstance = (Person) clazz.newInstance();
newInstance.eat();
newInstance.eat("苹果");
newInstance.eat("小询", "西瓜");
newInstance.staticMethod();
newInstance.staticMethod("123456789");
System.out.println("...................分界线.................");// 这个打印的目的是为了方便分析输出结果
Person.staticMethod();
Person.staticMethod("123456789");
System.out.println("以上的方法调用为普通的调用,下面为通过反射的方式调用");
Method m1 = clazz.getMethod("eat");
Method m2 = clazz.getMethod("eat", String.class);
Method m3 = clazz.getMethod("eat", String.class, String.class);
m1.invoke(newInstance);
m2.invoke(newInstance, "吃芒果");
m3.invoke(newInstance, "小询", "吃芒果");
//静态方法
Method m4 = clazz.getMethod("staticMethod");
Method m5 = clazz.getMethod("staticMethod", String.class);
m4.invoke(null);
m5.invoke(null,"aa");
}
// 使用反射根据构造方法创建实例
public static void test2() throws Exception {
//含参构造器
Class clazz = Class.forName("com.jiaxun.reflect.Person");
Constructor con = clazz.getConstructor(String.class);
Person newInstance = (Person) con.newInstance("zengjiaxun");
//空参构造器
Constructor con1 = clazz.getConstructor(null);//或Constructor con1 = clazz.getConstructor();
Person newInstance1 = (Person) con1.newInstance();
// 对象创建完成,现在可以调用方法了,方法如何调用参考上面即可
}
// 使用反射访问属性
public static void test3() throws Exception {
Class clazz = Class.forName("com.jiaxun.reflect.Person");
Constructor con = clazz.getConstructor();
Person newInstance = (Person)con.newInstance(null);
//由于我在Person类中没有将属性name的权限设为public所以要使用Field类中的getDeclaredField("name")方法而不能用getField("name")方法
Field field = clazz.getDeclaredField("name");
//设置属性访问权限方法
//设置name值
field.set(newInstance, "zengjiaxun");
String name = (String)field.get(newInstance);
System.out.println(name);
}
public static void main(String[] args) throws Exception {
test1();
test2();
test3();
}
}