Java 指定可以通过反射从对象获取哪些字段
我有些课看起来像这样Java 指定可以通过反射从对象获取哪些字段,java,reflection,Java,Reflection,我有些课看起来像这样 class Person { public String name; public String age; public String dateOfBirth; /* more fields */ public String[] fieldsToReflect() { return new String[] { "name", "age"} } } class Vehicle { public String make;
class Person {
public String name;
public String age;
public String dateOfBirth;
/* more fields */
public String[] fieldsToReflect()
{
return new String[] { "name", "age"}
}
}
class Vehicle {
public String make;
public String model;
public String mileage;
/* more fields */
public String[] fieldsToReflect()
{
return new String[] { "make", "model" }
}
}
Person
对象有许多字段,但是当从Person
实例获取字段时,我只想允许其他人访问name
和age
由于我可能处理任意对象(例如:aVehicle
对象),因此我认为统一处理应用程序中所有对象的最简单方法是让每个对象告诉我可以从中获得哪些字段
<> P>是否有其他方法可以考虑从对象中检索哪些字段?
可以使用注释,如
@ReflectableFields({"name", "age"})
class Person {
public String name;
public String age;
public String dateOfBirth;
}
@ReflectableFields
定义为
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface ReflectableFields {
String[] value();
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Reflectable {
// No field needed
}
或逐字段:
class Person {
@Reflectable
public String name;
@Reflectable
public String age;
public String dateOfBirth;
}
可反射的@定义为
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface ReflectableFields {
String[] value();
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Reflectable {
// No field needed
}
第一种解决方案不太冗长,但注释中的名称必须与字段名称一起更新。第二个解决方案似乎更详细,但字段名不需要明确。其他人可以自由忽略您提供的值并访问任何属性或方法,而不考虑范围。如果要限制范围,您应该使用private
&protected
。我不限制范围。所有这些字段都可以通过任何方式公开编辑。只是当涉及到使用反射获取数据的某些类时,我想说“这是我愿意让你通过反射获取的数据”,这对我来说没有多大意义。如果所有内容都是公共的,那么这意味着它可以被任何类访问,无论您是否使用反射。通常,您使用反射来获取可能隐藏的方法和字段。基本上,我有一个GUI表组件,用于显示对象的字段,我从对象列表中选择这些字段。这个列表可能包含各种不同的对象,我决定使用反射来统一处理这个系统中的任何对象,而不是其他设计决策。我不想让那个特定的表访问类中所有声明的字段,但我还有其他东西应该可以访问。我在哪里可以找到关于这些特定注释的更多信息?对不起,我应该解释更多:这些注释是您自己定义的注释。我会更新我的帖子。啊,是的,我想知道为什么我找不到关于它们的任何信息。我用@Reflectable
注释了几个字段,但是当我使用getDeclaredFields()
时,它仍然会抓取我在类中声明的所有字段。还有什么我需要做的吗?只需使用field.isAnnotationPresent(Reflectable.class)。看见