「java反射设置视频」java反射怎么实现的
本篇文章给大家谈谈java反射设置视频,以及java反射怎么实现的对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
java课程分享Java的反射机制
Java反射机制是一个非常强大的功能,在很多大型项目比如Spring,Mybatis都可以看见反射的身影。通过反射机制我们可以在运行期间获取对象的类型信息,利用这一特性我们可以实现工厂模式和代理模式等设计模式,同时也可以解决Java泛型擦除等令人苦恼的问题。下面java课程就从实际应用的角度出发,来应用一下Java的反射机制。
反射基础
p.s:本文需要读者对反射机制的API有一定程度的了解,如果之前没有接触过的话,建议先看一下官方文档的QuickStart。
在应用反射机制之前,首先我们先来看一下如何获取一个对象对应的反射类Class,在Java中我们有三种方法可以获取一个对象的反射类。
通过getClass方法
在Java中,每一个Object都有一个getClass方法,通过getClass方法我们可以获取到这个对象对应的反射类:
Strings="ziwenxie";
Class?c=s.getClass();
通过forName方法
我们也可以调用Class类的静态方法forName:
Class?c=Class.forName("java.lang.String");
使用.class
或者我们也可以直接使用.class:
Class?c=String.class;
获取类型信息
在文章开头我们就提到反射的一大好处就是可以允许我们在运行期间获取对象的类型信息,下面我们通过一个例子来具体看一下。
首先我们在typeinfo.interfacea包下面新建一个接口A:
packagetypeinfo.interfacea;
publicinterfaceA{voidf();}
接着我们在typeinfo.packageaccess包下面新建一个接口C,接口C继承自接口A,并且我们还另外创建了几个用于测试的方法,注意下面几个方法的权限都是不同的。
怎么用java实现反射,要简单点的。
*.properties文件内容如下:
MyClass=com.it.MyClass
InputStream ins = new FileInputStream(new File("*.properties"));
Properties props = new Properties();
props.load(ins);
String clazzName = props.getProperty("String key");
Object clazz = Class.forName(clazzName).newInstance();
MyClass myClass = (MyClass) clazz;
调用myClass的方法、函数即可.
java中反射如何使用
反射只是一个显得高大上的词。
其实反射的作用就是给你强行去访问别人的一些私有的成员变量或者是保护的成员变量。方便你在运行时实在需要修改别人的私有成员或者保护成员用的,有时候对完善第三方框架用的。
其实有了反射,所谓的私有成员或者是保护成员级的变量只是起一个防止出错、声明的作用,团队开发时告知一下别人没事少访问这个变量,但是有了反射,还是可以强行访问的。。。。
反射机制在java中如何做呀?
首先大体介绍下反射机制:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 举个简单的列子 import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class ReflectTester { /** * 通过java的反射机制获取类的所有属性和方法 */ public void test1() { try { Class c = Class.forName("demo1.client.Customer"); System.out.println("属性:"); Field f[] = c.getDeclaredFields(); for (int i = 0; i f.length; i++) { System.out.println(f[i].getName()); } System.out.println("方法:"); Method m[] = c.getDeclaredMethods(); for (int i = 0; i m.length; i++) { System.out.println(m[i].toString()); } } catch (Throwable e) { System.err.println(e); } } /** * 通过java的反射机制动态修改对象的属性 * @param o */ public void test2(Customer o) { try { Class c = o.getClass(); //getMethod方法第一个参数指定一个需要调用的方法名称,第二个参数是需要调用方法的参数类型列表,如无参数可以指定null,该方法返回一个方法对象 Method sAge = c.getMethod("setAge", new Class[] { int.class }); Method gAge = c.getMethod("getAge", null); Method sName = c.getMethod("setName", new Class[] { String.class }); //动态修改Customer对象的age Object[] args1 = { new Integer(25) }; sAge.invoke(o, args1); //动态取得Customer对象的age Integer AGE = (Integer) gAge.invoke(o, null); System.out.println("the Customer age is: " + AGE.intValue()); //动态修改Customer对象的name Object[] args2 = { new String("李四") }; sName.invoke(o, args2); } catch (Throwable e) { System.err.println(e); } } /** * 通过java的反射机制做一个简单对象的克隆 * @param o * @return */ public Object test3(Customer o) { Object o2 = null; try { Class c = o.getClass(); //通过默认构造方法创建一个新的对象 o2 = c.getConstructor(new Class[] {}).newInstance( new Object[] {}); Field fields[] = c.getDeclaredFields(); for (int i = 0; i fields.length; i++) { Field field = fields[i]; String fieldName = field.getName(); String firstLetter = fieldName.substring(0, 1).toUpperCase(); // 获得和属性对应的getXXX()方法的名字 String getMethodName = "get" + firstLetter + fieldName.substring(1); // 获得和属性对应的setXXX()方法的名字 String setMethodName = "set" + firstLetter + fieldName.substring(1); // 获得和属性对应的getXXX()方法 Method getMethod = c.getMethod(getMethodName, new Class[] {}); // 获得和属性对应的setXXX()方法 Method setMethod = c.getMethod(setMethodName, new Class[] { field.getType() }); // 调用原对象的getXXX()方法 Object value = getMethod.invoke(o, new Object[] {}); // 调用拷贝对象的setXXX()方法 setMethod.invoke(o2, new Object[] { value }); } } catch (Throwable e) { System.err.println(e); } return o2; } public static void main(String[] args) throws Exception { ReflectTester t = new ReflectTester(); t.test1(); Customer customer = new Customer(); customer.setAge(20); customer.setName("张三"); System.out.println("调用前name: " + customer.getName()); System.out.println("调用前age: " + customer.getAge()); t.test2(customer); System.out.println("调用后name: " + customer.getName()); System.out.println("调用后age: " + customer.getAge()); Customer customer2 = (Customer)t.test3(customer); System.out.println("克隆对象的name: " + customer2.getName()); System.out.println("克隆对象的age: " + customer2.getAge()); } } class Customer { private long id; private String name; private int age; public Customer() { } public Customer(String name, int age) { this.name = name; this.age = age; } public long getId() { return id; } public void setId(long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } 你可以自己运行下看看,再修改一些看看
如何使用java反射/java反射实例
public class Demo {
private String key1 = "1";
private String key2 = "2";
public String getKey1() {
return key1;
}
public void setKey1(String key1) {
this.key1 = key1;
}
public String getKey2() {
return key2;
}
public void setKey2(String key2) {
this.key2 = key2;
}
public static void main(String[] args) throws Exception {
//参数 “Demo” 是类的全名,如果在包结构下,要有完整包路径 比如: com.test.Demo
Class? clazz = Class.forName("Demo");
//“Demo”类必须有默认构造方法,否则会抛出异常
Demo demo = (Demo) clazz.newInstance();
System.out.println(demo.getKey1());
System.out.println(demo.getKey2());
}
}
关于java反射设置视频和java反射怎么实现的的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。