java 关于反射机制的问题
现在问题是这样的,一切问题都是相对于实体类的,比如有person-->teacher()-->math-teacher我用的getDeclarefield能获得属性值但是...
现在问题是这样的,一切问题都是相对于实体类的,比如有person-->teacher()-->math-teacher 我用的getDeclarefield能获得属性值 但是父类的属性无法获取,getSupperClass能获得最贴近的一个父类,现在问题如果有层继承,怎么获得所有属性,比如这个问题怎么获得math-teacher的所有属性
怕大家难以理解
我们会经常用到java 实体类 插入数据库的操作 ,我们知道重复写sql很麻烦 都要重复写属性字段,现在我用java的反射机制来实现,每一个实体类都有get和set方法,用getDelcaredField能这个获得所有实体类的所有属性,然后拼凑成sql语言。
现在我的问题是getDelcaredField只能获得实体类自身的属性 他的父类的属性无法获得,比如Person(name,sex),Teacher(school),Math_teacher(xxx) 我对Math_teacher这个类调用getDelcaredField,只能获得xxx的值,无法获得Teacher的属性值,
这个问题我也google过,但是上面只有获得最近一个父类的属性值(既是Teacher),如果有多层继承呢,如何获得Math_teacher的所有属性值既是(name,sex,school,xxx)。 展开
怕大家难以理解
我们会经常用到java 实体类 插入数据库的操作 ,我们知道重复写sql很麻烦 都要重复写属性字段,现在我用java的反射机制来实现,每一个实体类都有get和set方法,用getDelcaredField能这个获得所有实体类的所有属性,然后拼凑成sql语言。
现在我的问题是getDelcaredField只能获得实体类自身的属性 他的父类的属性无法获得,比如Person(name,sex),Teacher(school),Math_teacher(xxx) 我对Math_teacher这个类调用getDelcaredField,只能获得xxx的值,无法获得Teacher的属性值,
这个问题我也google过,但是上面只有获得最近一个父类的属性值(既是Teacher),如果有多层继承呢,如何获得Math_teacher的所有属性值既是(name,sex,school,xxx)。 展开
9个回答
展开全部
java中有些方法定义中是允许抛出可能出现的异常的,你的这个class方法在
API中是这样定义的public static Class<?> forName(String className)
throws ClassNotFoundException他默认抛出的是找不到类异常。改正应该在这一句外面加上
try {
Class c = Class.forName("abc.UserBean");
}catch(Exception e){}
这样就不会错了。(Exception是一切异常类的父类)
API中是这样定义的public static Class<?> forName(String className)
throws ClassNotFoundException他默认抛出的是找不到类异常。改正应该在这一句外面加上
try {
Class c = Class.forName("abc.UserBean");
}catch(Exception e){}
这样就不会错了。(Exception是一切异常类的父类)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
向上转型就行。
例如,你的math-teacher向上转型成teacher,获取属性,再转型成person,再获取属性
转型会吧
math-teacher mt = new math-teacher();
teacher t = (teacher)mt;
person p = (person)t;
然后你就随意获取属性吧
欢迎和我讨论讨论
例如,你的math-teacher向上转型成teacher,获取属性,再转型成person,再获取属性
转型会吧
math-teacher mt = new math-teacher();
teacher t = (teacher)mt;
person p = (person)t;
然后你就随意获取属性吧
欢迎和我讨论讨论
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
import java.util.Vector;
public class FillTest extends JFrame{
public static void main(String args[]){
Object somebody=new Math_teacher("一班","XX中学","王丽","女");
Vector<String> s=getFileds(somebody.getClass());
for(int i=0;i<s.size();i++){
System.out.println(i+":"+s.get(i));
}
}
private static Vector<String> getFileds(Class someClass){
Vector<String> names=new Vector<String>();
if(someClass.equals(Object.class)) return names;
Field f[]=someClass.getDeclaredFields();
for(int i=0;i<f.length;i++){
names.add(f[i].getName());
}
names.addAll(getFileds(someClass.getSuperclass()));
return names;
}
}
class Person{
String name;
String sex;
Person(String name,String sex){
this.name=name;
this.sex=sex;
}
}
class Teacher extends Person{
String school;
public Teacher(String school,String name,String sex){
super(name,sex);
this.school=school;
}
}
class Math_teacher extends Teacher{
String xxx;
public Math_teacher(String xxx,String school, String name, String sex) {
super(school, name, sex);
this.xxx=xxx;
}
}
public class FillTest extends JFrame{
public static void main(String args[]){
Object somebody=new Math_teacher("一班","XX中学","王丽","女");
Vector<String> s=getFileds(somebody.getClass());
for(int i=0;i<s.size();i++){
System.out.println(i+":"+s.get(i));
}
}
private static Vector<String> getFileds(Class someClass){
Vector<String> names=new Vector<String>();
if(someClass.equals(Object.class)) return names;
Field f[]=someClass.getDeclaredFields();
for(int i=0;i<f.length;i++){
names.add(f[i].getName());
}
names.addAll(getFileds(someClass.getSuperclass()));
return names;
}
}
class Person{
String name;
String sex;
Person(String name,String sex){
this.name=name;
this.sex=sex;
}
}
class Teacher extends Person{
String school;
public Teacher(String school,String name,String sex){
super(name,sex);
this.school=school;
}
}
class Math_teacher extends Teacher{
String xxx;
public Math_teacher(String xxx,String school, String name, String sex) {
super(school, name, sex);
this.xxx=xxx;
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
class Parent {
public int one;
protected int two;
private int three;
public Rectangle[] rect;
public int[] a;
}
public class FieldD extends Parent {
public int four;
protected int five;
private int six;
static String getTypeName(Class type) {
if (type.isArray()) {
try {
Class cl = type;
int dimensions = 0;
while (cl.isArray()) {
dimensions++;
cl = cl.getComponentType();
}
StringBuffer sb = new StringBuffer();
sb.append(cl.getName());
for (int i = 0; i < dimensions; i++) {
sb.append("[]");
}
return sb.toString();
} catch (Throwable e) { /*FALLTHRU*/ }
}
return type.getName();
}
public static void main(String[] args) {
String value = "123" + "\n" + "123";
System.out.println(value);
Class c = FieldD.class;
System.out.println("The class " + c.getName() + " has the following fields: ");
System.out.println("");
Field[] fields = c.getFields();
String name, typeName, className, fieldName;
for (int i = 0; i < fields.length; i++) {
int mod = fields[i].getModifiers();
if (mod == 0) {
name = "";
} else {
name = Modifier.toString(mod);
}
typeName = getTypeName((fields[i].getType()));
className = getTypeName(fields[i].getDeclaringClass());
fieldName = fields[i].getName();
Rectangle rect = new Rectangle();
System.out.println(name + " " + typeName + " " + className + " " + fieldName);
}
}
}
只能发射public.
public int one;
protected int two;
private int three;
public Rectangle[] rect;
public int[] a;
}
public class FieldD extends Parent {
public int four;
protected int five;
private int six;
static String getTypeName(Class type) {
if (type.isArray()) {
try {
Class cl = type;
int dimensions = 0;
while (cl.isArray()) {
dimensions++;
cl = cl.getComponentType();
}
StringBuffer sb = new StringBuffer();
sb.append(cl.getName());
for (int i = 0; i < dimensions; i++) {
sb.append("[]");
}
return sb.toString();
} catch (Throwable e) { /*FALLTHRU*/ }
}
return type.getName();
}
public static void main(String[] args) {
String value = "123" + "\n" + "123";
System.out.println(value);
Class c = FieldD.class;
System.out.println("The class " + c.getName() + " has the following fields: ");
System.out.println("");
Field[] fields = c.getFields();
String name, typeName, className, fieldName;
for (int i = 0; i < fields.length; i++) {
int mod = fields[i].getModifiers();
if (mod == 0) {
name = "";
} else {
name = Modifier.toString(mod);
}
typeName = getTypeName((fields[i].getType()));
className = getTypeName(fields[i].getDeclaringClass());
fieldName = fields[i].getName();
Rectangle rect = new Rectangle();
System.out.println(name + " " + typeName + " " + className + " " + fieldName);
}
}
}
只能发射public.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
可能是因为父类的成员变量为私有变量,在运用反射时候需要在之前调用
java.lang.reflect.AccessibleObject这个类的如下方法
public void setAccessible(boolean flag)
让其值为true,才可以拿到私有变量,否则是操纵不了的。
java.lang.reflect.AccessibleObject这个类的如下方法
public void setAccessible(boolean flag)
让其值为true,才可以拿到私有变量,否则是操纵不了的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询