我在下面有一个示例类,我想返回某些类型的所有类字段,在此类型为Image的示例中.
public class Contact {
private String surname, lastname, address;
private int age, floor;
private Image contactPhoto, companyPhoto;
private boolean isEmployed;
public String[] getAllImages() {
String images[] = // missing code
return images;
// in this case, I want to return {"contactPhoto","companyPhoto"}
}
}
Run Code Online (Sandbox Code Playgroud)
我需要一个帮助.如何查找特定类型的所有类字段.我将在另一个类c中调用此方法.
我不断遇到这种语法,但找不到任何解释。
private static final String TAG = MainActivity.class.getSimpleName();
Log.i(TAG,”some log statement”);
Run Code Online (Sandbox Code Playgroud)
class关键字是什么意思MainActivity.class.getSimpleName();
此代码的外观和使用方式的完整图片
public class MainActivity extends AppCompatActivity {
//What does "class" signify in the following MainActivity.class.getSimpleName();
private static final String TAG = MainActivity.class.getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i(TAG, "onCreate()");
}
}
Run Code Online (Sandbox Code Playgroud) 我对 lambda 表达式很陌生,所以请耐心等待。假设我有一个带有单个抽象函数的接口:
public interface IAbsFunc {
public abstract void absFunc(int x);
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我可以将 lambda 表达式存储在变量中:
public class Lambda {
public static void main(String[] args) {
IAbsFunc obj = (int x) -> System.out.println(x);
obj.absFunc(3);
}
}
Run Code Online (Sandbox Code Playgroud)
如果我理解正确,这就像将方法存储在变量中。但是,这已经可以通过 java.lang.reflect 完成:
public class Lambda {
public static void main(String[] args) throws Exception {
Method obj = PrintStream.class.getDeclaredMethod("println", int.class);
obj.invoke(System.out, 3);
}
}
Run Code Online (Sandbox Code Playgroud)
显然我在这里遗漏了一些东西。在什么情况下 lambda 表达式更可取?
我试图创建一个创建类的新对象的方法,但我希望能够创建许多不同类的对象,因此为每个类创建一个方法对我来说不起作用.有没有什么方法可以将类传递给方法,以便可以创建新对象?我的所有类都有相同的构造函数.
这是我的课:
public enum Currency {
NIS, USD, EUR, GBP, JPY, AUD, CAD, DKK, NOK, ZAR, SEK, CHF, JOD, LBP, EGP;
private String name;
private int unit;
private String country;
private double rate;
private double change;
}
Run Code Online (Sandbox Code Playgroud)
当我尝试使用反射获取此类的字段名称时,我得到了专用字段和枚举常量(NIS,EUR,....)
如何仅获取专用字段名称?
在一个非常庞大的项目中,有很多ExceptionClasses,其中实现了异常细节enum.
NAME_OF_EXCEPTION_DETAIL(ID, PRIORITY)
Run Code Online (Sandbox Code Playgroud)
例如:
NO_LICENSE_FOUND(100, 0)
UNSUPPORTED_LICENSE(101, 1)
WRONG_LICENSE_FOR_VERSION(101, 0)
Run Code Online (Sandbox Code Playgroud)
在某些情况下,异常详细信息ID是相同的,应该永远不会发生.很可能有更多的重复,但这个项目是巨大的手工检查...
是否有一种智能的方法来检查重复的代码,例如UnitTesting - 从未使用它.
谢谢你的帮助!
编辑(当只使用一个枚举时,Bens答案是解决此问题的好方法):为了更清楚我的具体任务,这就是情况.编写了很多类来处理ExceptionDetails,例如
TopicOneExceptionDetails.java
TopicTwoExceptionDetails.java (and so on)
Run Code Online (Sandbox Code Playgroud)
这些类中的每一个都定义了这个主题的枚举,如下所示:
public enum TopicOneExceptionDetails implements ApplicationException.ExceptionDetails { .... }
Run Code Online (Sandbox Code Playgroud)
然后声明与TopicOne错误相关的错误,例如
SETTING_TIMEZONE_FAILED(55, ...)
Setting_DATETIME_FAILED(56, ...)
Run Code Online (Sandbox Code Playgroud)
在这个TopicOne的枚举中,每个错误ID都必须是唯一的.但是例如ID 55(此处用于SETTING_TIMEZONE_FAILED)可用于声明与TopicTwo相关的错误而没有问题.
编辑2(使用思考?)我找到了一篇关于马特·谢泼德写的关于java 的非常有用的答案.我认为这可以解决我的问题.我需要休息但我会报告回来.我目前的想法是:Reflections
Reflections reflections = new Reflections("project.de")
for(Class<? extends ApplicationException.ExceptionDetails> exceptionDetailsClasses : reflections.getSubTypesOf(ApplicationException.ExceptionDetails.class)){
for ( ... ) .. }
Run Code Online (Sandbox Code Playgroud)
我应该能够检查ID,例如Ben建议.我稍后会报告.
编辑3(问题解决了!)就像在编辑2中描述的那样,我能够轻松地解决这个问题reflections.
public class ApplicationExceptionDetailsErrorCodeValidationTest {
@Test
public void validateErrorCodeUniqueness() throws ErrorCodeUniquenessBroken{ …Run Code Online (Sandbox Code Playgroud) 我正在尝试在我的 Android 应用程序中实现按钮点击处理。
在包含我的按钮的 XML 布局文件中,我向我的ButtonXML 元素添加了以下行:
android:onClick="handleClick"
Run Code Online (Sandbox Code Playgroud)
我还在Activity使用此布局的 中定义了具有以下签名的方法:
public void handleClick() { /* ... */ }
Run Code Online (Sandbox Code Playgroud)
但是,当我使用此代码运行我的应用程序时,它崩溃了。我能够通过将我的方法签名更新为以下内容来修复此崩溃:
public void handleClick(View v) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)
但我不明白为什么我需要包含这个View参数?
那问题就是这么说的.这是我想要的一个例子
String s = new String();
List<s.type> ls = new ArrayList<s.type>();
Run Code Online (Sandbox Code Playgroud)
这样的东西,或任何优雅的方式来实现这一点,如果条件或条件逻辑,请不要多,因为可能有无限的数据类型,我在这里仅使用字符串作为一个例子,它可以是任何东西.
我需要解释以下问题:
我在反思中很困惑。我已经阅读了很多文件,但我仍然感到困惑。请给我一个我能完全理解的解释。
java ×9
reflection ×4
android ×2
object ×2
android-view ×1
class ×1
enums ×1
generics ×1
lambda ×1
methods ×1
types ×1
unit-testing ×1