反射机制获取并动态操作_方法_属性_构造器

获取属性等的相关代码示例:

package ReflectProject;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* 获取类的属性、方法、构造方法
* @author Administrator
*
*/
public class Test2 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException, NoSuchMethodException {
String path = "ReflectEntity.User";
//1.获取类的名称
Class c = Class.forName(path);
System.out.println("类的全名称:"+c.getName());
System.out.println("类的名称:"+c.getSimpleName());

//获取父类的class对象
Class csuper = c.getSuperclass();
System.out.println("类的全名称:"+csuper.getName());
System.out.println("类的名称:"+csuper.getSimpleName());

//2.获取类的属性
// Field f = c.getField("ID");//报错,只能获取公开的属性
// System.out.println(f);
Field[] fields = c.getFields();
System.out.println(fields.length);//为0,依旧只能获得公开的属性

Field[] fields2 = c.getDeclaredFields();
System.out.println(fields2.length);//为3
for(Field field:fields2) {
System.out.println(field);//调用了tostring方法
System.out.println(field.getModifiers()+"\t"+field.getType()+"\t"+field.getName());//2代表私有属性
}

//3.获取类的方法信息
Method[] methods = c.getDeclaredMethods();
System.out.println(methods.length);
for(Method method:methods) {
// System.out.println(method);
System.out.println("访问权限:"+method.getModifiers()+"\t返回值类型:"+method.getReturnType()+"\t方法名称:"+method.getName());
//获取方法的参数
Class[] cPara = method.getParameterTypes();
for(Class c1 :cPara) {
System.out.println("方法的参数类型:"+c1.getTypeName());
}
System.out.println("----------------------------");
}

//4.获取类的构造器(构造方法)
Constructor[] constructors = c.getConstructors();
for (Constructor constructor : constructors) {
System.out.println(constructor);
}
//获取指定的构造方法
Constructor con = c.getConstructor(null);
System.out.println(con);
Constructor con2 = c.getConstructor(int.class,String.class,String.class);
System.out.println(con2);

}

}

动态的操作属性、方法、构造方法相关代码示例:

package ReflectProject;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import ReflectEntity.User;

/**
* 动态的操作属性、方法、构造方法
* @author Administrator
*
*/
public class Test3 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException {
//得到class对象
Class c = Class.forName("ReflectEntity.User");
//得到无参构造方法
Constructor cons = c.getConstructor(null);
//通过无参构造方法的对象,创建User类的对象
User user = (User) cons.newInstance();
//动态操作属性
Field field = c.getDeclaredField("ID");
field.setAccessible(true);//这个属性不需要安全检查了,可以直接访问
//通过反射直接赋值
field.set(user, 1001);
System.out.println("取出ID这个属性的值:"+field.get(user));

//动态操作方法
Method m = c.getDeclaredMethod("setUserName", String.class);
//执行这个方法
m.invoke(user, "张三");
Method m2 = c.getDeclaredMethod("getUserName", null);
System.out.println(m2.invoke(user));
}
}

原文地址:https://www.cnblogs.com/LuJunlong/p/12155844.html

时间: 2024-10-11 02:27:20

反射机制获取并动态操作_方法_属性_构造器的相关文章

反射机制--获取类的方法

一.反射机制获取一个类的方法 1.使用class属性 类名.class 2.使用Class类的forName("类名")方法, Class.forName("类名") 3.new一个类然后调getClass()方法 new 类名().getClass() 实例: public void text() throws ClassNotFoundException{ //第一种方式 Class cla = Integer.class; //第二种方式 Class cla2

java反射机制中的动态代理

java反射机制中的动态代理 动态代理模式及其使用 步骤1:定义一个接口 //接口 interface Subject{ void action(); } 步骤2:定义一个接口的实现类,也就是被代理类 //被代理类 class RealSubject implements Subject { @Override public void action() { System.out.println("我是被代理类,请执行我"); } } 步骤3:定义一个实现InvocationHandle

C#使用反射机制获取类信息[转]

http://www.cnblogs.com/zhoufoxcn/archive/2006/10/31/2515873.html 1.用反射动态创建类实例,并调用其公有成员函数. //新建一个类库项目,增加一个GetSum方法. using System; namespace ClassLibrary1 { public class Class1 { public Class1() { } public int GetSum(int x, int y) { return x + y; } } }

java 中利用反射机制获取和设置实体类的属性值

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. JAVA反射(放射)机制:"程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言".从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言.但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可

java反射机制应用之动态代理

1.静态代理类和动态代理类区别 静态代理:要求被代理类和代理类同时实现相应的一套接口:通过代理类的对象调用重写接口的方法时,实际上执行的是被代理类的同样的 方法的调用. 动态代理:在程序运行时,根据被代理类及其实现的接口,动态的创建一个代理类.当调用代理类的实现的抽象方法时,就发起对被代理类同样方法的调用. 涉及到的技术点: ①提供一个实现了InvocationHandler接口实现类,并重写其invoke()方法 ②Proxy.newProxyInstance(obj.getClass().g

利用反射机制获取属性的值遇到的坑

类: public Class Test { public string name; public string value; } Test t=new Test(); t.name="abc"; t.value="123"; string str=(string)t.GetType().GetProperty("name").GetValue(t,null); 找了3个小时,都找不出问题在哪里,由于这是我自己写的类,所以我就怀疑是不是类有问题,

java反射机制之Method invoke执行调用方法例子

昨天在群里跟大家讨论了下java反射调用可变参数的问题,这个问题起因是我们需要反射调用另一个部门提供的方法,我同事说java不能反射调用可变参数的方法,于是我写了个demo证明了他这个观点的错误.但是测试过程中,有一点我不明白,就是反射调用可变参数的方法时,为什么一定要保证传入的参数数组长度为1,在群里跟大家讨论了很多,没有得到确切的答案,参照网上大牛写的东西和我自己跟源码的过程,记录如下: 1.两个类,一个父类,一个子类 [java] view plain copy print? packag

Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别(转)

一.Java的反射机制   每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图:  其中 i.加载是指将编译后的java类文件(也就是.class文件)中的二进制数据读入内存,并将其放在运行时数据区的方法区内,然后再堆区创建一个Java.lang.Class对象,用来封装类在方法区的数据结构.即加载后最终得到的是Class对象,并且更加值得注意的是:该Java.lang.Class对象是单实例的,无论这个类创建了多少个对象,他的Class对象时唯一的!!!!.

java 反射机制获取类名、属性、方法、构造器和反射动态使用

被反射的类: @Table("tb_student") public class Student { @Fields(columnName="id",type="int",length=10) private int id; @Fields(columnName="studentName",type="varchar",length=10) private String studentName; @Fiel