最近项目中用到java的需要用到java的反射机制,主要用于jdbc数据库的sql语句的封装,现在将java反射机制的一些常用的方法总结如下:
主要由以下类来实现Java反射机制,这些类都位于java.lang.reflect包中:
Class类:代表一个类。
Field 类:代表类的成员变量(成员变量也称为类的属性)。
Method类:代表类的方法。
Constructor 类:代表类的构造方法。
Array类:提供了动态创建数组,以及访问数组的元素的静态方法。
在java.lang.Object 类中定义了getClass()方法,因此对于任意一个Java对象,都可以通过此方法获得对象的类型。Class类是Reflection API 中的核心类,它有以下方法
getName():获得类的完整名字。
getFields():获得类的public类型的属性。
getDeclaredFields():获得类的所有属性。
getMethods():获得类的public类型的方法。
getDeclaredMethods():获得类的所有方法。
getMethod(String name, Class[] parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes 参数指定方法的参数类型。
getConstructors():获得类的public类型的构造方法。
getConstructor(Class[] parameterTypes):获得类的特定构造方法,parameterTypes 参数指定构造方法的参数类型。
newInstance():通过类的不带参数的构造方法创建这个类的一个对象。
下面是具体方法的使用demo:
新建类student
package com.javareflect.model;
public class Student {
private int id ;
public String name ;
public int number;
private int age ;
private String address;
public Student(){
}
public Student(String name ,int number ,int age ,String address){
this.name = name ;
this.number = number;
this.age = age ;
this.address = address;
}
@Override
public String toString(){
return "name="+getName()+" number="+getNumber() + " age="+getAge()+" address="+getAddress();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Student getStudent(int id ){
return new Student("张三",1,34,"广东省揭阳市") ;
}
public Student getStudent(String name ,String address){
return new Student(name,1,34,address) ;
}
}
public class Student {
private int id ;
public String name ;
public int number;
private int age ;
private String address;
public Student(){
}
public Student(String name ,int number ,int age ,String address){
this.name = name ;
this.number = number;
this.age = age ;
this.address = address;
}
@Override
public String toString(){
return "name="+getName()+" number="+getNumber() + " age="+getAge()+" address="+getAddress();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Student getStudent(int id ){
return new Student("张三",1,34,"广东省揭阳市") ;
}
public Student getStudent(String name ,String address){
return new Student(name,1,34,address) ;
}
}
用junit新建一个测试类
package com.javareflect.test;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import org.junit.Test;
import com.javareflect.model.Student;
public class TestStudent {
@SuppressWarnings("rawtypes")
@Test
public void test() {
Student student = new Student();
Class<? extends Student> stuClass = student.getClass();
//拿到所有的属性
Field[] fields = stuClass.getDeclaredFields();
for (Field field : fields) {
System.out.println("fieldName:"+field.getName());
}
//--------------------------------------------------------------------------------------
//拿到public属性
Field[] pulic_fields = stuClass.getFields();
for (Field field : pulic_fields) {
System.out.println("public_fieldName:"+field.getName());
}
//--------------------------------------------------------------------------------------
//拿到构造方法
Constructor[] construtors = stuClass.getConstructors();
for(Constructor constructor : construtors){
// System.out.println("contrutor--Modifiers="+constructor.getModifiers());
System.out.println("contrutor--name:"+constructor.getName());
//拿到构造函数的参数类型
Class[] classes = constructor.getParameterTypes();
for (int i = 0; i < classes.length; i++) {
System.out.println("contrutor--getParameterType:"+classes[i].getName());
}
}
//--------------------------------------------------------------------------------------
//拿到方法
Method[] methods = stuClass.getMethods();
for(Method method : methods){
//拿到方法名
System.out.println("method--name:"+method.getName());
//拿到方法的返回参数
System.out.println("method--turntype:"+method.getGenericReturnType());
}
//--------------------------------------------------------------------------------------
//执行对象某个方法
Student Student = new Student();
Class<? extends Student> stuActionClass = Student.getClass();
try {
//拿到对象的方法
Method method = stuActionClass.getMethod("getStudent", new Class[]{int.class});
//执行对象的方法
Student student1 = (Student) method.invoke(Student, new Object[]{new Integer(1)});
System.out.println(student1);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//--------------------------------------------------------------------------------------
//通过类直接实例一个对象
Class<Student> studentActionClass = Student.class;
try {
//拿到对象的方法
Method method = studentActionClass.getMethod("getStudent", new Class[]{int.class});
//执行对象的方法
Student student1 = (Student) method.invoke(Student, new Object[]{new Integer(1)});
System.out.println(student1);
} catch (Exception e) {
e.printStackTrace();
}
}
}
具体结果太长就不贴出来了...共同学习import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import org.junit.Test;
import com.javareflect.model.Student;
public class TestStudent {
@SuppressWarnings("rawtypes")
@Test
public void test() {
Student student = new Student();
Class<? extends Student> stuClass = student.getClass();
//拿到所有的属性
Field[] fields = stuClass.getDeclaredFields();
for (Field field : fields) {
System.out.println("fieldName:"+field.getName());
}
//--------------------------------------------------------------------------------------
//拿到public属性
Field[] pulic_fields = stuClass.getFields();
for (Field field : pulic_fields) {
System.out.println("public_fieldName:"+field.getName());
}
//--------------------------------------------------------------------------------------
//拿到构造方法
Constructor[] construtors = stuClass.getConstructors();
for(Constructor constructor : construtors){
// System.out.println("contrutor--Modifiers="+constructor.getModifiers());
System.out.println("contrutor--name:"+constructor.getName());
//拿到构造函数的参数类型
Class[] classes = constructor.getParameterTypes();
for (int i = 0; i < classes.length; i++) {
System.out.println("contrutor--getParameterType:"+classes[i].getName());
}
}
//--------------------------------------------------------------------------------------
//拿到方法
Method[] methods = stuClass.getMethods();
for(Method method : methods){
//拿到方法名
System.out.println("method--name:"+method.getName());
//拿到方法的返回参数
System.out.println("method--turntype:"+method.getGenericReturnType());
}
//--------------------------------------------------------------------------------------
//执行对象某个方法
Student Student = new Student();
Class<? extends Student> stuActionClass = Student.getClass();
try {
//拿到对象的方法
Method method = stuActionClass.getMethod("getStudent", new Class[]{int.class});
//执行对象的方法
Student student1 = (Student) method.invoke(Student, new Object[]{new Integer(1)});
System.out.println(student1);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//--------------------------------------------------------------------------------------
//通过类直接实例一个对象
Class<Student> studentActionClass = Student.class;
try {
//拿到对象的方法
Method method = studentActionClass.getMethod("getStudent", new Class[]{int.class});
//执行对象的方法
Student student1 = (Student) method.invoke(Student, new Object[]{new Integer(1)});
System.out.println(student1);
} catch (Exception e) {
e.printStackTrace();
}
}
}