相关疑难解决方法(0)

在Java中使用匿名类被认为是不好的风格还是好的?

我知道在实现Listener和类似的东西时,匿名类可以保存输入.他们试图取代一些封闭用法.

但社区对这种语言特征的价值有何看法?它是否有意义并且您经常使用它吗?它是否使代码更清晰,更易理解,更易于维护?或者匿名类使代码可读性降低?

您对此有什么看法,请举例说明/支持您的意见吗?

java coding-style anonymous-class

37
推荐指数
5
解决办法
1万
查看次数

在Android中查找包中的所有类

如何在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)

java android

15
推荐指数
3
解决办法
2万
查看次数

在Java中,/(即正斜杠)在像$Lambda$15/0x00000008000a9440@32e6e9c3这样的对象引用中意味着什么?

在 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 jvm jshell

10
推荐指数
1
解决办法
368
查看次数

什么意思是带有美元符号和数字.class的java文件名(名称$ 1.class)?

当我编译我的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)

java enums overriding class inner-classes

7
推荐指数
1
解决办法
3739
查看次数

编译后在Java枚举中创建的隐式内部类

我正在学习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.但是为什么在这个代码中它创建了没有内部类.

java enums

6
推荐指数
0
解决办法
56
查看次数

Kotlin:从自身/内部引用匿名对象(通过 this)

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我如何从内部访问它(如果有的话)?

android this anonymous-class kotlin

5
推荐指数
1
解决办法
2542
查看次数

使用 postgres 驱动程序播放光滑的数据库配置问题

我正在尝试使用 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)

postgresql scala playframework slick play-slick

4
推荐指数
1
解决办法
2220
查看次数

Reflection Class.forName()查找类<classname> $ 1和<classname> $ 2,它们是什么?

我偶然使用反射来解码一些用户字符串条目,在某些情况下可以是简单的整数位(0-9),有时它可以是对另一个类方法的调用.

检查字符串输入userInput以查看是否存在具有该名称的类:

Class<?> c = Class.forName(this.getClass().getName() + "$" + userInput);
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是,当用户输入"1"或"2"时,Class.forName()确实找到了具有该名称的类.这可能是基本的Java,所以请原谅我:这些类是什么?我使用调试器跟踪代码并检查其他数字,似乎只定义了1和2.

java reflection

3
推荐指数
2
解决办法
674
查看次数

在InteliJ IDEA中调试Java期间,美元符号在生成的变量名中意味着什么?是关闭吗?

在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库,我正在尝试了解其工作原理。

在此处输入图片说明

java debugging intellij-idea reactive-programming sodium

3
推荐指数
1
解决办法
990
查看次数

如何使用 Frida 获取 ANDROID_ID

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 android frida

2
推荐指数
1
解决办法
2256
查看次数