用java的反射机制怎么获取一个类中里面方法中局部变量

用java的反射机制怎么获取一个类中里面方法中局部变量,第1张

public class Person {

    private String name;

    private int age;

    public String getName() {

        return name;

    }

    public void setName(String name) {

        thisname = name;

    }

    public int getAge() {

        return age;

    }

    public void setAge(int age) {

        thisage = age;

    }

    public static void main(String[] args) {

        try {

            Class c = ClassforName(PersonclassgetName());

            //获取类的属性

            Field[] fields = cgetDeclaredFields();

            for (int i = 0; i < fieldslength; i++) {

                Systemoutprintln("类的属性有:"+ ModifiertoString(fields[i]getModifiers())+"   "+fields[i]getType()+"    "+fields[i]getName());

            }

            //获取类的方法

            Method[] methods= cgetMethods();

            for (int j = 0; j <methodslength ; j++) {

                Systemoutprintln("类的方法有:"+ModifiertoString(methods[j]getModifiers())+"   "+methods[j]getReturnType()+"  "+methods[j]getName());

            }

        } catch (ClassNotFoundException e) {

            eprintStackTrace();

        }

    }

}

//运行结果如下:

类的属性有:private   class javalangString    name

类的属性有:private   int    age

类的方法有:public static   void  main

类的方法有:public   class javalangString  getName

类的方法有:public   void  setName

类的方法有:public   void  setAge

类的方法有:public   int  getAge

类的方法有:public final   void  wait

类的方法有:public final   void  wait

类的方法有:public final native   void  wait

类的方法有:public   boolean  equals

类的方法有:public   class javalangString  toString

类的方法有:public native   int  hashCode

类的方法有:public final native   class javalangClass  getClass

类的方法有:public final native   void  notify

类的方法有:public final native   void  notifyAll

首先连接数据库;(把其中的OleDbConnection换成sql数据库的链接对象SqlConnection )

private static OleDbConnection connection;

public static OleDbConnection Connection

{

get

{

if (connection == null)

{

connection = new OleDbConnection(SystemConfigurationConfigurationManagerConnectionStrings["ConnectionString"]ConnectionString);

connectionOpen();

}

else if (connectionState == SystemDataConnectionStateClosed) //关闭

{

connectionOpen();

}

else if (connectionState == SystemDataConnectionStateBroken) //中断

{

connectionClose();

connectionOpen();

}

return connection;

}

}

然后执行查询语句,返回一个数据集(同样把OleDb的对象换成Sql数据对象):

public static IList<User> GetUsersAll()

{

OleDbConnection connection = DataManagementConnection;

string sql = "select from [user] order by [id] desc";

OleDbCommand cmd = new OleDbCommand(sql, connection);

OleDbDataReader dr = cmdExecuteReader();

IList<User> uList = new List<User>();

while (drRead())

{

User u = new User();

uid = ConvertToInt32(dr["id"]);

uuser_address = dr["user_address"]ToString();

uuser_city = dr["user_city"]ToString();

uuser_company = dr["user_company"]ToString();

uuser_contact = dr["user_contact"]ToString();

uuser_country = dr["user_country"]ToString();

uuser_email = dr["user_email"]ToString();

uuser_fax = dr["user_fax"]ToString();

uuser_name = dr["user_name"]ToString();

uuser_note = dr["user_note"]ToString();

uuser_ok =ConvertToBoolean( dr["user_ok"]);

uuser_pass = dr["user_pass"]ToString();

uuser_state = dr["user_state"]ToString();

uuser_tel = dr["user_tel"]ToString();

uuser_time = ConvertToDateTime(dr["user_time"]);

uuser_vip =ConvertToBoolean( dr["user_vip"]);

uuser_web = dr["user_web"]ToString();

uuser_zip = dr["user_zip"]ToString();

uListAdd(u);

}

drClose();

connectionClose();

return uList;

}

最后把集合中数据放到ListBox中

IList<User> uList=GetUsersAll();

foreach( User u in uList)

{

//选择你要显示的数据放在ListBox中

//这里我显示名称uuser_name

ListBox1Itemsadd("名称:"+uuser_name)

}

object obj = (bGetType())GetProperty("a)GetValue(b, null);

if(obj != null && obj is A)

{

A aObj = obj as A;

int result = intParse((aObjGetType())

GetProperty("memberId")GetValue(aObjnull)ToString());

}

(bGetType())GetProperty("memberId")GetValue(b, null)//这个获取memberId的值就为null了。。。

因为对象b没有名字为memberId的属性

(bGetType())GetProperty("amemberId")GetValue(b, null)//这样也为null了。。。

原因同上没有名字为amemberId的属性

Method类中的方法的使用(含代码和注释):

getMethods()获得本类及父类中的public权限修饰符方法

getDeclaredMethods()专门获得调用该方法的对象的本类中的所有方法包括private权限修饰符的方法

getDeclaredMethod(String name,class<>parameterTypes)

第一个参数:方法的名称

第二个参数:可变长度,写你要查找的那个方法的参数类型列表class

getParameterCount()得到方法的参数个数123456

package LessonForReflection03;import javalangreflectMethod;import javalangreflectModifier;abstract class Card{

private void creatRandomNumbers(int count)//private关键字

{

}

public void getFullCardsNumbers(String[] random, String pre_numbers)

{

}

public static void getUserInfor()

{

}

public abstract void getUserInfor(String tel);

public abstract void getUserInfor(int sal1, int sal2) throws ArrayIndexOutOfBoundsException,ArithmeticException;}public class MethodInforGetter {

public static void main(String[] args) 

{

Class<> c1 = Cardclass;

Systemoutprintln("-------------------------");

Method[] m1 = c1getMethods();//getMethods()获得本类及父类中的public方法!

for (Method m:m1)

{

Systemoutprintln(m);

}

Systemoutprintln("-------------------------");

Method[] m2 = c1getDeclaredMethods();//getDeclaredMethods()专门获得本类中的所有方法包括private!

for (Method m:m2)

{

Systemoutprintln(m);

}

Systemoutprintln("-------------------------");

/

getDeclaredMethod(String name,class<>parameterTypes)

第一个参数:方法的名称

第二个参数:可变长度,写你要查找的那个方法的参数类型列表

 getParameterCount()得到方法的参数个数

/

try 

{

Method m3 = c1getDeclaredMethod("getUserInfor");

Systemoutprintln(m3);

//getParameterCount()方法,获得方法参数个数

Systemoutprintln(m3getParameterCount());

Systemoutprintln(ModifiertoString(m3getModifiers()));//获得方法修饰符

Systemoutprintln(m3getReturnType());

Systemoutprintln("-------------------------");

Method m4 = c1getDeclaredMethod("getUserInfor", intclass,intclass);

//getExceptionTypes()可以获得初始化当前Method对象的给Class对象初始化的那个类的那个指定方法抛出的异常类型

Class<>[] exception = m4getExceptionTypes();

for (Class<> e:exception)

{

Systemoutprintln(e);

}

} catch (NoSuchMethodException | SecurityException e) 

{

eprintStackTrace();

}

}}12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788

Constructor类中的方法的使用>

javalangreflectConstructor:

Constructor[] getConstructor()获得本类里的public权限修饰符构造函数,不能获取父类的!

Constructor[] getDeclaredConstructor()获得本类中的所以构造函数!

Constructor<T> getConstructor(ClassparameterType)用参数决定获得本类中的某个的构造方法,只能获得public的

Constructor<T> getDeclaredConstructor(ClassparameterType)用参数决定获得本类中的某个构造方法

附:

JDK80之后新增的类:

Executable:

它是Method和Constructor的父类

常用方法:

getParameter()获得类中方法参数

getExceptionTypes()获得类中某个方法抛出异常类型

getMoidfiers()获得方法权限修饰符

Parameter:

封装并代表了参数实例123456789101112131415

package LessonForReflection03;import javalangreflectConstructor;import javalangreflectModifier;import javalangreflectParameter;/

 javalangreflectConstructor

 Constructor[] getConstructor();获得本类里的public权限修饰符构造函数,不能获取父类的

  Constructor[] getDeclaredConstructor();得本类里的全部构造

  Constructor<T> getConstructor(ClassparameterType);用参数决定获得哪个构造方法

  Constructor<T> getDeclaredConstructor(ClassparameterType);

/public class ConstructorInforGetter {

public static void main(String[] args) 

{

Systemoutprintln("获得Cricle本类里的public权限修饰符构造函数,不能获取父类的Constructor[] getConstructor()");

Systemoutprintln("子类继承不了父类中的构造方法和private");

//Constructor[] getConstructor()获得Cricle本类里的public权限修饰符构造函数,不能获取父类的

//子类继承不了父类中的构造方法和private

Class<Circle> c1 = Circleclass;

Constructor<>[] cons1 = c1getConstructors();

for (Constructor<> cons:cons1)

{

Systemoutprintln(cons);

//Systemoutprintln(consgetName());

}

Systemoutprintln("-----------------------");

Systemoutprintln("方法获得本类中的所有构造函数getDeclaredConstructor()");

Constructor<>[] cons2 = c1getDeclaredConstructors();

for (Constructor<> cons:cons2)

{

Systemoutprintln(cons);

}

Systemoutprintln("-----------------------");

try 

{

Systemoutprintln("方法用参数指定获得本类!构造方法,只能获取public的Constructor<T> getConstructor(ClassparameterType)");

Constructor<> cons3 = c1getConstructor(intclass);

Systemoutprintln(ModifiertoString(cons3getModifiers()));

Systemoutprintln(cons3);

Systemoutprintln("-----------------------");

Systemoutprintln("方法用参数指定获得本类!构造方法任何权限修饰符的都可以获得Constructor<T> getDeclaredConstructor(ClassparameterType)");

Constructor<> cons4 = c1getDeclaredConstructor(Stringclass);

Systemoutprintln(cons4);

Systemoutprintln("-----------------------");

/

 JDK80之后新增的类

 Executable:

 是Method和Constructor的父类

 方法:

 getParameter();

 getExceptionTypes();

 getModifiers();

          getTypeParameters();

  Parameter:

  封装并代表了参数实例

/

Systemoutprintln("获取类中方法的参数getParameters()");

Constructor<> cons5 = c1getDeclaredConstructor(intclass,Stringclass);

Parameter[] p1 = cons5getParameters();

for (Parameter p:p1)

{

Systemoutprintln(p);

}

} catch (NoSuchMethodException | SecurityException e) 

{

eprintStackTrace();

}

}}123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687

代码中提到的Circle类和Shape类二者为继承关系:

package LessonForReflection03;public class Circle extends Shape{

private int r;

private String color;

public Circle(int r, String color) 

{

super();

thisr = r;

thiscolor = color;

}

public Circle(int r) 

{

super();

thisr = r;

}

protected Circle(String color) 

{

super();

thiscolor = color;

}

Circle()

{

super();

}}12345678910111213141516171819202122232425262728293031

package LessonForReflection03;public class Shape {

private int per;

public Shape(int per) 

{

super();

thisper = per;

}

public Shape() 

{

super();

}}1234567891011121314151617

部分文字来源于:

咕嘟咖啡杨海滨老师 — 《java编程语言高级特性》

轻量化研习Java相关技术倡导者

“爱码学院”联合创始人自适应教学理念提出者践行者;多年开发及项目管理经历;出版《JavaEE企业级应用与开发》一书;10余年高校项目实践毕设指导经验;企业软培经验丰富

我用test1 params1=null;params1=(test1) ClassforName("asdftest1")newInstance();

这一句就已经可以使用test1里面的公有方法和参数了。

的确,没错的。你拿到了Class对象,就相当于拿到了test1的一个副本样,能拿到他的属性和方法。但是你拿到了后该干什么的?你不去调用方法吗?不去给属性设置值吗?你这个就相当于我定义了一个类,里面有属性和方法,但是我外部程序不去调用它。invoke就是调用方法的。

invoke的中文含义就是调用哎。自己百度下invoke的含义吧。

反射的核心就是要拿到该类的字节码对象---》Class对象。(真的是核心,不要看到就这几个字)

都拿到了该类的字节码了,那么该类的什么都能拿到了。比如:属性,方法,构造器,泛型,注解等等。反射使得java具有非常活跃的应用。你能想到的框架,如SSH,无一不利用了反射机制。以及一些设计模式,如动态代理(基于jdk)等,IoC、DI、AOP等等,底层都用到了反射。

至于真么用反射,我就不说了,网上多得是,随便百度一下就是一大把。

等你学完SSH,理解一些常用的设计模式,看看他们的底层实现,反射就通了。

C#中没区别 ToString()的实现还和用Convert实现相同。

至于装箱,估计楼主多虑了。

1 两个不同的类型转换,一定存在创建目标对象的过程。即创建一个字符串引用。

2 平提到的装箱,一般存在于 int 到 Int32时的转换,但C#中实质Int32是结构体,并非Java中的一个是值类型,一个是包装类的关系。int只是C#中为Int32提供一个简易的关键字形式出现,编译为IL后还是以Int32表示。

Int32的定义:

public struct Int32 : IComparable, IFormattable,

IConvertible, IComparable<int>, IEquatable<int>

以上就是关于用java的反射机制怎么获取一个类中里面方法中局部变量全部的内容,包括:用java的反射机制怎么获取一个类中里面方法中局部变量、关于C#使用反射,利用反射从SQLDataReader中遍历数据,给对象赋值。、如何通过反编译通过父类获取子类属性值。给了吊毛,浪费分了,重发。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9485820.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存