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中遍历数据,给对象赋值。、如何通过反编译通过父类获取子类属性值。给了吊毛,浪费分了,重发。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)