反射类的学习
2016-07-19 23:06
369 查看
今天学习了反射的使用,JVM通过类加载器,将编译后的字节码文件解析成四个部分:Class(类)、Field(属性)、Constructor(构造器)、Method(方法)。
反射就是通过字节码文件创建对象,并操作对象的方法。
package com.meiran;
import com.meiran.domain.Student;
import org.junit.Test;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class ReflectTest {
/**
* 获取Class对象的三种方法
*/
@Test
public void testClass() throws Exception {
//1
Class clazz1 = Student.class;
//2、通过对象实例
Student s = new Student();
Class clazz2 = s.getClass();
//3、通过forName---框架中最常用的方法
Class clazz3 = Class.forName("com.meiran.domain.Student");
//new实例-无参的构架方法
Student student = (Student) clazz3.newInstance();
//new实例-有参数的构造方法
Constructor constructor = clazz3.getConstructor(Integer.class, String.class);
Student student2 = (Student) constructor.newInstance(50, "test");
System.out.println(student2);
}
@Test
public void test() {
try {
//获取Class对象
Class clazz = Class.forName("com.meiran.domain.Student");
//new对象
Student s = (Student) clazz.newInstance();
//获取属性对象
Field field = clazz.getDeclaredField("id");
field.setAccessible(true);//设置访问权限,可以访问private
//设置属性值
field.set(s, 584);
System.out.println(field.get(s));
//获取方法对象
Method getNameMethod = clazz.getDeclaredMethod("setName", String.class);
//操作方法
getNameMethod.invoke(s, "bbb");//调用这个方法
Field field2 = clazz.getDeclaredField("name");
field2.setAccessible(true);
System.out.println(field2.get(s));
} catch (Exception e) {
e.printStackTrace();
}
}
}
反射就是通过字节码文件创建对象,并操作对象的方法。
package com.meiran;
import com.meiran.domain.Student;
import org.junit.Test;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class ReflectTest {
/**
* 获取Class对象的三种方法
*/
@Test
public void testClass() throws Exception {
//1
Class clazz1 = Student.class;
//2、通过对象实例
Student s = new Student();
Class clazz2 = s.getClass();
//3、通过forName---框架中最常用的方法
Class clazz3 = Class.forName("com.meiran.domain.Student");
//new实例-无参的构架方法
Student student = (Student) clazz3.newInstance();
//new实例-有参数的构造方法
Constructor constructor = clazz3.getConstructor(Integer.class, String.class);
Student student2 = (Student) constructor.newInstance(50, "test");
System.out.println(student2);
}
@Test
public void test() {
try {
//获取Class对象
Class clazz = Class.forName("com.meiran.domain.Student");
//new对象
Student s = (Student) clazz.newInstance();
//获取属性对象
Field field = clazz.getDeclaredField("id");
field.setAccessible(true);//设置访问权限,可以访问private
//设置属性值
field.set(s, 584);
System.out.println(field.get(s));
//获取方法对象
Method getNameMethod = clazz.getDeclaredMethod("setName", String.class);
//操作方法
getNameMethod.invoke(s, "bbb");//调用这个方法
Field field2 = clazz.getDeclaredField("name");
field2.setAccessible(true);
System.out.println(field2.get(s));
} catch (Exception e) {
e.printStackTrace();
}
}
}
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树