我想在运行时访问声明字段的泛型类型.我之前的印象是,由于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 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) 在Android环境中,跟踪每个应用程序的数据使用情况,包括前台和后台.以编程方式,什么代表前景和后台数据使用?
Android是否根据您的应用程序的活动是否在屏幕上显示(IE:在onCreate/onResume和onPause方法之间)并且线程在该时间段内运行来跟踪此统计信息?或者它是否跟踪数据是否从优先级为THREAD_PRORITY_BACKGROUND的线程下载?或者它使用的是另一个州吗?
在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中测试弱引用的正确方法是什么?
我最初的想法是做以下事情:
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) 我想知道是否有人使用Transfuse以及它与Android Annotations的区别.我的意思是每个人的利弊,除了这两个之外还有其他选择.
谢谢.
有谁知道使用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)
显然,由于演员阵容,这有点混乱.
我正在尝试用于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) 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的方法,其中注入未绑定的类是一个错误. …
我有以下代码产生错误: 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) java ×6
android ×5
generics ×2
guice ×2
parceler ×2
classloader ×1
parcelable ×1
realm ×1
serializable ×1
transfuse ×1
type-erasure ×1
unit-testing ×1