小编Joh*_*sen的帖子

Java Generics:在运行时访问Generic Type

我想在运行时访问声明字段的泛型类型.我之前的印象是,由于Java类型的擦除,这是不可能的.但是,情况并非如此,因为一些众所周知的框架在运行时通过反射来利用泛型类型.

例如,Guice将根据您提供的泛型类型实现Provider:

public class Injectable{

    @Inject
    private Provider<SomeType> someTypeProvider;

}
Run Code Online (Sandbox Code Playgroud)

如何通过反射API访问字段的"SomeType"泛型属性或任何此类类型/方法/等?

此外,了解如何通过Java 6 Annotation Processor API访问这些泛型类型属性也很有帮助.

谢谢.

编辑:

谢谢大家的指示.我找到了一种方法,使用haylem的链接,特别是Prenkov的文章Java Reflection:Generics.

这是我正在寻找的答案:

/**
 * @author John Ericksen
 */
public class TypeReflectionExample {

    public class SomeType{}

    public class Injectable{
        @Inject  private Provider<SomeType> someTypeProvider;
    }

    public static void main(String[] args){

        try {
            Field providerField = Injectable.class.getDeclaredField("someTypeProvider");

            Type genericFieldType = providerField.getGenericType();

            if(genericFieldType instanceof ParameterizedType){
                ParameterizedType aType = (ParameterizedType) genericFieldType;
                Type[] fieldArgTypes = aType.getActualTypeArguments();
                for(Type fieldArgType : fieldArgTypes){
                    Class fieldArgClass = (Class) fieldArgType; …
Run Code Online (Sandbox Code Playgroud)

java generics guice type-erasure annotation-processing

14
推荐指数
1
解决办法
7913
查看次数

Android 6及更高版本的Android SSLSocket握手失败

我编写了一个基于Java SSLServerSocket的服务器,它接受连接并通过自定义二进制协议与Android应用程序通信:

ServerSocket serverSocket = SSLServerSocketFactory.getDefault().createServerSocket(1234);
while (true) {
    Socket socket = serverSocket.accept();
    ...
}
Run Code Online (Sandbox Code Playgroud)

我使用以下参数运行服务器:

-Djavax.net.ssl.keyStore=keystore.jks
-Djavax.net.ssl.keyStorePassword=<PASSWORD>
Run Code Online (Sandbox Code Playgroud)

并使用以下教程生成证书,该教程构建公钥和私钥集:http://judebert.com/progress/archives/425-Using-SSL-in-Java,-Part-2.html:

keytool -genkeypair -keystore keystore.jks -alias keyname
keytool -export -alias keyname -file keyname.crt -keystore keystore.jks 
keytool -importcert -file keyname.crt -keystore truststore.jks
Run Code Online (Sandbox Code Playgroud)

另外,我通过使用bouncycastle构建一个信任库来使它与android兼容:

keytool -importkeystore -srckeystore truststore.jks -srcstoretype JKS -srcstorepass <PASSWORD> -destkeystore truststore.bks -deststoretype BKS -deststorepass <PASSWORD> -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath bcprov-ext-jdk15on-1.58.jar
Run Code Online (Sandbox Code Playgroud)

在此下载bouncycastle提供商:https://www.bouncycastle.org/latest_releases.html

并将生成的truststore.bks移动到原始资源文件夹中.

在Android上我使用以下代码构建一个SSLSocketFactory允许我导入生成的bouncycastle证书,该证书对我的服务器进行身份验证:

KeyStore trustStore = KeyStore.getInstance("BKS");
InputStream trustStoreStream = context.getResources().openRawResource(R.raw.truststore);
trustStore.load(trustStoreStream, "<PASSWORD>".toCharArray()); …
Run Code Online (Sandbox Code Playgroud)

java android sslhandshakeexception sslsocketfactory

13
推荐指数
1
解决办法
928
查看次数

Android后台下载统计信息

在Android环境中,跟踪每个应用程序的数据使用情况,包括前台和后台.以编程方式,什么代表前景和后台数据使用?

Android是否根据您的应用程序的活动是否在屏幕上显示(IE:在onCreate/onResume和onPause方法之间)并且线程在该时间段内运行来跟踪此统计信息?或者它是否跟踪数据是否从优先级为THREAD_PRORITY_BACKGROUND的线程下载?或者它使用的是另一个州吗?

multithreading android

11
推荐指数
1
解决办法
357
查看次数

在父/子类加载器之间访问Package Private元素

在Java应用程序中,我声明了两个类,一个One在ClassLoader A中声明的class()和另一个Two在ClassLoader B中声明的class().ClassLoader A是B的父级.这两个类都具有相同的包(即:)org.test.

我似乎One无法从Two事件中访问包的私有方法或varialbes,虽然A是B'd父类ClassLoader,我得到一个IllegalAccessError例外.我知道包私有可访问性基于包名和ClassLoader.

有没有办法重新关联One,Two以便Two可以访问One的包私有元素?

这是证明这一点的测试:

package org.test;

public class ClassLoaderTest {

    @Test
    public void testLoading() throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
        One one = new One();
        one.value = "test";

        MemoryClassLoader classLoader = new MemoryClassLoader();

        String name = one.getClass().getPackage().getName() + ".Two";

        classLoader.add(name,
            "package org.test;\n" +
            "\n" +
            "public class Two{\n" +
            "    public static String getValue(One one){\n" + …
Run Code Online (Sandbox Code Playgroud)

java classloader

9
推荐指数
1
解决办法
1671
查看次数

测试WeakReference

在Java中测试弱引用的正确方法是什么?

我最初的想法是做以下事情:

public class WeakReferenceTest {

    public class Target{
        private String value;    

        public Target(String value){
            this.value = value;
        }    
        public String toString(){
            return value;
        }
    }

    public class UsesWeakReference{    
        WeakReference<Target> reference;   

        public UsesWeakReference(Target test){
            reference = new WeakReference<Target>(test);
        }    
        public String call(){
            Target test = reference.get();
            if(test != null){
                return test.toString();
            }
            return "empty";
        }
    }

    @Test
    public void testWeakReference(){    
        Target target = new Target("42");

        UsesWeakReference usesWeakReference = new UsesWeakReference(target);    
        WeakReference<Target> triggerReference = new WeakReference<Target>(target);    
        assertEquals("42", usesWeakReference.call());

        target = null; …
Run Code Online (Sandbox Code Playgroud)

java unit-testing weak-references

8
推荐指数
2
解决办法
2685
查看次数

Transfuse与AndroidAnnotations

我想知道是否有人使用Transfuse以及它与Android Annotations的区别.我的意思是每个人的利弊,除了这两个之外还有其他选择.

谢谢.

android android-annotations transfuse

8
推荐指数
1
解决办法
1633
查看次数

Sun CodeModel通用方法

有谁知道使用CodeModel生成以下泛型方法声明:

public <T> T getValue(Class<T> clazz){...}
Run Code Online (Sandbox Code Playgroud)

用法:

ValueType value = getValue(ValueType.class);
Run Code Online (Sandbox Code Playgroud)

似乎不是由现有的implmentation处理.

我知道我可以按如下方式处理代码,但它需要一个强制转换:

public Object getValue(Class class){...}
Run Code Online (Sandbox Code Playgroud)

用法:

ValueType value = (ValueType)getValue(ValueType.class);
Run Code Online (Sandbox Code Playgroud)

显然,由于演员阵容,这有点混乱.

java generics sun-codemodel

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

使用Parceler与android

我正在尝试用于Android的Parceler库.到目前为止,我只有一个相同的错误,使用文档中的普通样本.

@Parcel(Parcel.Serialization.BEAN)
public class Example {
  private String name;
  private int age;

  public String getName() { return name; }
  public void setName(String name) { this.name = name; }

  public int getAge() { return age; }
  public void setAge(int age) { this.age = age; }
}
Run Code Online (Sandbox Code Playgroud)

Parcelable p = Parcels.wrap(new Example());
Run Code Online (Sandbox Code Playgroud)

哪个崩溃了

07-30 12:31:46.439: E/AndroidRuntime(4945): FATAL EXCEPTION: main
07-30 12:31:46.439: E/AndroidRuntime(4945): Process: com.sample.app.android.debug, PID: 4945
07-30 12:31:46.439: E/AndroidRuntime(4945):  org.parceler.ParcelerRuntimeException: Unable to find generated Parcelable  class for com.sample.app.android.entity.Example, verify …
Run Code Online (Sandbox Code Playgroud)

android parceler

6
推荐指数
1
解决办法
5859
查看次数

你如何阻止Guice注入一个没有绑定在模块中的类?

import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Inject;
import com.google.inject.Injector;

public class GuiceDemo
{
    public static void main(String[] args)
    {
        new GuiceDemo().run();
    }

    public void run()
    {
        Injector injector = Guice.createInjector(new EmptyModule());
        DemoInstance demoInstance = injector.getInstance(DemoInstance.class);
        assert(demoInstance.demoUnbound == null);
    }

    public static class EmptyModule extends AbstractModule
    {
        @Override
        protected void configure()
        {
        }
    }

    public static class DemoInstance
    {
        public final DemoUnbound demoUnbound;

        @Inject
        public DemoInstance(DemoUnbound demoUnbound)
        {
            this.demoUnbound = demoUnbound;
        }
    }

    public static class DemoUnbound
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以阻止Guice向DemoInstance的构造函数提供DemoUnbound实例吗?

本质上,我正在寻找一种在完全显式的绑定模式下运行Guice的方法,其中注入未绑定的类是一个错误. …

java guice

5
推荐指数
2
解决办法
3148
查看次数

使用parceler(@Parcel)和Realm.io(Android)

我有以下代码产生错误: Error:Parceler: Unable to find read/write generator for type io.realm.Realm for io.realm.RealmObject.realm

它没有工作extends RealmObject,但是我想使用Realm轻松地放入数据库.有没有办法驱逐RealmObject字段,只使用@Parcel的基本pojo字段?

@Parcel
public class Feed extends RealmObject{
    int id;
    public String text;
    public String time_created;
    String time_modified;
    int comments_count;
    int likes_count;
    String feed_type;
    int obj_id;
    String image;
    String user_name;
    String user_earthmile_points;
    boolean liked;
    boolean commented;
    boolean is_private;
    String url;
    int feed_creator_id;

   }
Run Code Online (Sandbox Code Playgroud)

android serializable realm parcelable parceler

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