Preciso obter o valor de um campo usando reflexão. Acontece que nem sempre tenho certeza de qual é o tipo de dados do campo. Para isso, e para evitar alguma duplicação de código, criei o seguinte método:
@SuppressWarnings("unchecked")
private static <T> T getValueByReflection(VarInfo var, Class<?> classUnderTest, Object runtimeInstance) throws Throwable {
Field f = classUnderTest.getDeclaredField(processFieldName(var));
f.setAccessible(true);
T value = (T) f.get(runtimeInstance);
return value;
}
E use este método como:
Long value1 = getValueByReflection(inv.var1(), classUnderTest, runtimeInstance);
ou
Double[] value2 = getValueByReflection(inv.var2(), classUnderTest, runtimeInstance);
O problema é que não consigo lançar Integer
para Long
:
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long
Existe uma maneira melhor de conseguir isso?
Estou usando o Java 1.6.
java
reflection
casting
Tiago Veloso
fonte
fonte
Number[]
e um loop sobre ele para criar uma matriz digitada de maneira apropriada, certo?double[]
, por exemplo, mas iria trabalhar para umDouble[]
.Number
. Ou, dito de outra forma: qual regra de conversão você acredita que permite a conversão de uma para a outra?Simplesmente:
fonte
int
valores.Integer
paraint
e depois converte paralong
antes de passar para oLong(long)
construtor obsoleto .Isso evita o impacto no desempenho da conversão para uma String. O
longValue()
método em Integer é apenas uma conversão do valor int. OLong.valueOf()
método dá ao vm a chance de usar um valor armazenado em cache.fonte
Estranhamente, descobri que, se você analisar a partir de uma string, funciona.
Ganhar.
fonte
Convertendo Inteiro em Longo Muito Simples e muitas maneiras de converter esse
Exemplo 1
Exemplo 2
Exemplo 3
Exemplo 4
Se você já tem o int digitado como um inteiro, você pode fazer o seguinte:
fonte
Converta um inteiro diretamente em longo adicionando 'L' ao final do inteiro.
fonte
Se o inteiro não for nulo
i
será automaticamente convertido em along
.Usar em
valueOf
vez denew
permite o armazenamento em cache desse valor (se for pequeno) pelo compilador ou JVM, resultando em um código mais rápido.fonte
fonte
Se você sabe que o Integer não é NULL, você pode simplesmente fazer isso:
fonte
ou
fonte
Um analisador de
int
variáveis para olong
tipo está incluído naInteger
classe. Aqui está um exemplo:Você pode usar facilmente essa função embutida para criar um método que analisa de
int
paralong
:fonte
Isto é seguro para nulos
fonte
Se você não souber a classe exata do seu número ( Inteiro , Longo , Duplo , qualquer que seja), você pode lançar para Número e obter seu valor longo a partir dele:
fonte
No caso de uma lista do tipo longa, adicionando L ao final de cada valor inteiro
fonte
Tente converterValue de Jackson
fonte