我知道在实现Listener和类似的东西时,匿名类可以保存输入.他们试图取代一些封闭用法.
但社区对这种语言特征的价值有何看法?它是否有意义并且您经常使用它吗?它是否使代码更清晰,更易理解,更易于维护?或者匿名类使代码可读性降低?
您对此有什么看法,请举例说明/支持您的意见吗?
如何在Android上找到包中的所有类?我使用PathClassLoader,但它总是返回一个空的枚举?
附加信息
尝试了建议的思考方法.关于反射图书馆的重要点夫妇.通过maven central提供的库与Android不兼容,并提供dex错误.我必须包含源代码并编译dom4j,java-assist.
反射的问题,我的原始解决方案是android中的PathClassLoader返回包的空枚举.
方法的问题是Android中的getResource总是返回空枚举.
final String resourceName = aClass.getName().replace(".", "/") + ".class";
for (ClassLoader classLoader : loaders) {
try {
final URL url = classLoader.getResource(resourceName);
if (url != null) {
final String normalizedUrl = url.toExternalForm().substring(0, url.toExternalForm().lastIndexOf(aClass.getPackage().getName().replace(".", "/")));
return new URL(normalizedUrl);
}
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud) 在 JShell 中,如果我这样做:
interface Foo { String foo(); }
(Foo) () -> "hi"
Run Code Online (Sandbox Code Playgroud)
我明白了
| created interface Foo
$2 ==> $Lambda$15/0x00000008000a9440@32e6e9c3
Run Code Online (Sandbox Code Playgroud)
通过以下研究,我知道以下内容:
$Lambda = 对生成的字节码的内存中引用,而不是由匿名内部类 (AIC) 持久保存到磁盘的引用
$15 = AIC 的对象引用
@32e6e9c3 =创建的对象的序列号——至少在 IntelliJ 中
但是(斜线)表示什么/,如/0x00000008000a9440?
当我编译我的java Enum Day时,它会生成他的Day.class文件和8天$#.class Files,所以我想知道为什么编译器生成8 $#.class而不是7,因为我有7个枚举常量,但是8覆盖注释,我已经知道Dollar.class文件是为每个内部类或枚举常量生成的,但是八个.class文件为它生成了什么呢?
package com.kaissersoft.test.objective.one.three.enums;
public enum Day{
SUNDAY(01){
@Override
public void salute(){
System.out.println("Today is Sunday");
}
},
MONDAY(02){
@Override
public void salute(){
System.out.println("Today is Monday");
}
},
TUESDAY(03){
@Override
public void salute(){
System.out.println("Today is Tuesday");
}
},
WEDNESDAY(04){
@Override
public void salute(){
System.out.println("Today is Wednesday");
}
},
THURSDAY(05){
@Override
public void salute(){
System.out.println("Today is Thursday");
}
},
FRIDAY(06){
@Override
public void salute(){
System.out.println("Today is Friday");
}
},
SATURDAY(07){
@Override
public void salute(){
System.out.println("Today is Saturday");
}
}; …Run Code Online (Sandbox Code Playgroud) 我正在学习Enum并对此代码感到困惑.
enum Currency{
PENNY, NICKLE, DIME, QUARTER;
@Override
public String toString() {
switch (this) {
case PENNY:
System.out.println("Penny: ");
break;
case NICKLE:
System.out.println("Nickle: ");
break;
case DIME:
System.out.println("Dime: ");
break;
case QUARTER:
System.out.println("Quarter: ");
}
return super.toString();
}
};
public class Check{
public static void main(String[] args){
}
}
Run Code Online (Sandbox Code Playgroud)
当我编译javac Check.java我得到以下.class文件.
Check.class
Currency$1.class
Currency.class
Run Code Online (Sandbox Code Playgroud)
为什么Currency$1.class要创建?如何?背后的原因是什么?我知道内部类的$符号和1代表匿名类1.但是为什么在这个代码中它创建了没有内部类.
TL;DR
这些object : someClass{ }匿名对象无法通过访问自身this(这会导致外部对象)。我怎样才能访问它?
更长的解释:
对于我的片段,我需要一个 PreDrawListener。我在 onCreateView 中调用它。执行时,我想随后删除监听器。所以 Java 的做法会建议这样的事情
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
val treeObserver = layout.viewTreeObserver
treeObserver.addOnPreDrawListener(object : ViewTreeObserver.OnPreDrawListener {
override fun onPreDraw(): Boolean {
layout.viewTreeObserver.removeOnPreDrawListener(this)
...
}
}
Run Code Online (Sandbox Code Playgroud)
问题是,当观察对象时,removeOnPreDrawListener(this)对象this不是听众,而是myFragment$onCreateView$1@f019bf0
或者,我可以访问this@MyFragment它直接返回对片段的引用。
不过,这些选项似乎都不适合我PreDrawListener。我如何从内部访问它(如果有的话)?
我正在尝试使用 slick 和 postgres 设置一个简单的 play 2.5 应用程序,但似乎无法克服错误。
我得到的错误是
[error] p.a.d.s.DefaultSlickApi - Failed to create Slick database config for key default.
slick.SlickException: Error getting instance of profile "slick.jdbc.PostgresProfile"
...
Caused by: java.lang.InstantiationException: slick.jdbc.PostgresProfile
...
Caused by: java.lang.NoSuchMethodException: slick.jdbc.PostgresProfile.<init>()
...
Run Code Online (Sandbox Code Playgroud)
我有以下内容 application.conf
slick.dbs.default {
driver = "slick.jdbc.PostgresProfile"
db = {
driver = "org.postgresql.Driver"
user = postgres
host = localhost
port = 5432
password = ""
host = ${?EVENTUAL_DB_HOST}
port = ${?EVENTUAL_DB_PORT}
user = ${?EVENTUAL_DB_USER}
password = ${?EVENTUAL_DB_PW}
url = "jdbc:postgresql://"${slick.dbs.default.db.host}":"${slick.dbs.default.db.port}"/"${slick.dbs.default.db.user}
} …Run Code Online (Sandbox Code Playgroud) 我偶然使用反射来解码一些用户字符串条目,在某些情况下可以是简单的整数位(0-9),有时它可以是对另一个类方法的调用.
检查字符串输入userInput以查看是否存在具有该名称的类:
Class<?> c = Class.forName(this.getClass().getName() + "$" + userInput);
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是,当用户输入"1"或"2"时,Class.forName()确实找到了具有该名称的类.这可能是基本的Java,所以请原谅我:这些类是什么?我使用调试器跟踪代码并检查其他数字,似乎只定义了1和2.
在InteliJ中调试Java期间,变量名中的美元符号是什么意思?是关闭吗?请查看下面的图片和代码段。
这是Stream类的一部分:
public final Listener listen(final Handler<A> action) {
return listen_(Node.NULL, new TransactionHandler<A>() {
public void run(Transaction trans2, A a) {
action.run(a);
}
});
}
Run Code Online (Sandbox Code Playgroud)
我怀疑$1in Stream$1@915指的是在上述方法中创建的闭包。我不确定。有人可以确认吗?或如果不是这种情况,请说明在此生成的名称中美元符号的含义是什么?
该代码取自Sodium Functional Reactive库,我正在尝试了解其工作原理。

该ANDROID_ID是在Android的每个应用程序是唯一的。
为了ANDROID_ID在 Android 中使用 Java,我使用以下代码:
import android.content.Context;
import android.content.ContentResolver;
import android.provider.Settings;
protected void onCreate(...) {
context = (Context)this;
String androidId = Settings.Secure.getString((ContentResolver)context.getContentResolver(), (String)"android_id");
}
Run Code Online (Sandbox Code Playgroud)
但我想在我的 andoird 手机上的其他应用程序中运行它。
我想为此使用Frida。
我正在用 Python 加载我注入的脚本:
import frida
device = frida.get_usb_device()
pid = device.spawn(["com.target.app"])
device.resume(pid)
time.sleep(1) #Without it Java.perform silently fails
session = device.attach(pid)
script = session.create_script(open("jsfrida.js").read())
script.load()
#prevent the python script from terminating
raw_input()
Run Code Online (Sandbox Code Playgroud)
但在我的脚本中,我不明白如何称呼它,这是我尝试过的:
Java.perform(function (){
console.log("Inside java perform function");
var ActivityThread = Java.use('android.app.ActivityThread');
var Context = …Run Code Online (Sandbox Code Playgroud) java ×8
android ×3
enums ×2
class ×1
coding-style ×1
debugging ×1
frida ×1
jshell ×1
jvm ×1
kotlin ×1
overriding ×1
play-slick ×1
postgresql ×1
reflection ×1
scala ×1
slick ×1
sodium ×1
this ×1