ReflectiveProperty.smali
.class Lio/dcloud/nineoldandroids/util/ReflectiveProperty;
.super Lio/dcloud/nineoldandroids/util/Property;
# annotations
.annotation system Ldalvik/annotation/Signature;
value = {
"<T:",
"Ljava/lang/Object;",
"V:",
"Ljava/lang/Object;",
">",
"Lio/dcloud/nineoldandroids/util/Property<",
"TT;TV;>;"
}
.end annotation
# static fields
.field private static final PREFIX_GET:Ljava/lang/String; = "get"
.field private static final PREFIX_IS:Ljava/lang/String; = "is"
.field private static final PREFIX_SET:Ljava/lang/String; = "set"
# instance fields
.field private mField:Ljava/lang/reflect/Field;
.field private mGetter:Ljava/lang/reflect/Method;
.field private mSetter:Ljava/lang/reflect/Method;
# direct methods
.method public constructor <init>(Ljava/lang/Class;Ljava/lang/Class;Ljava/lang/String;)V
.registers 14
.annotation system Ldalvik/annotation/Signature;
value = {
"(",
"Ljava/lang/Class<",
"TT;>;",
"Ljava/lang/Class<",
"TV;>;",
"Ljava/lang/String;",
")V"
}
.end annotation
const-string v0, ")"
const-string v1, "does not match Property type ("
const-string v2, ") "
const-string v3, "Underlying type ("
.line 1
invoke-direct {p0, p2, p3}, Lio/dcloud/nineoldandroids/util/Property;-><init>(Ljava/lang/Class;Ljava/lang/String;)V
const/4 v4, 0x0
.line 2
invoke-virtual {p3, v4}, Ljava/lang/String;->charAt(I)C
move-result v5
invoke-static {v5}, Ljava/lang/Character;->toUpperCase(C)C
move-result v5
const/4 v6, 0x1
.line 3
invoke-virtual {p3, v6}, Ljava/lang/String;->substring(I)Ljava/lang/String;
move-result-object v7
.line 4
new-instance v8, Ljava/lang/StringBuilder;
invoke-static {v5}, Ljava/lang/String;->valueOf(C)Ljava/lang/String;
move-result-object v5
invoke-direct {v8, v5}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V
invoke-virtual {v8, v7}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v8}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v5
.line 5
new-instance v7, Ljava/lang/StringBuilder;
const-string v8, "get"
invoke-direct {v7, v8}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V
invoke-virtual {v7, v5}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v7}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v7
const/4 v8, 0x0
.line 7
:try_start_38
invoke-virtual {p1, v7, v8}, Ljava/lang/Class;->getMethod(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;
move-result-object v9
iput-object v9, p0, Lio/dcloud/nineoldandroids/util/ReflectiveProperty;->mGetter:Ljava/lang/reflect/Method;
:try_end_3e
.catch Ljava/lang/NoSuchMethodException; {:try_start_38 .. :try_end_3e} :catch_3f
goto :goto_67
.line 13
:catch_3f
:try_start_3f
invoke-virtual {p1, v7, v8}, Ljava/lang/Class;->getDeclaredMethod(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;
move-result-object v7
iput-object v7, p0, Lio/dcloud/nineoldandroids/util/ReflectiveProperty;->mGetter:Ljava/lang/reflect/Method;
.line 14
invoke-virtual {v7, v6}, Ljava/lang/reflect/Method;->setAccessible(Z)V
:try_end_48
.catch Ljava/lang/NoSuchMethodException; {:try_start_3f .. :try_end_48} :catch_49
goto :goto_67
.line 17
:catch_49
new-instance v7, Ljava/lang/StringBuilder;
const-string v9, "is"
invoke-direct {v7, v9}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V
invoke-virtual {v7, v5}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v7}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v7
.line 19
:try_start_57
invoke-virtual {p1, v7, v8}, Ljava/lang/Class;->getMethod(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;
move-result-object v9
iput-object v9, p0, Lio/dcloud/nineoldandroids/util/ReflectiveProperty;->mGetter:Ljava/lang/reflect/Method;
:try_end_5d
.catch Ljava/lang/NoSuchMethodException; {:try_start_57 .. :try_end_5d} :catch_5e
goto :goto_67
.line 25
:catch_5e
:try_start_5e
invoke-virtual {p1, v7, v8}, Ljava/lang/Class;->getDeclaredMethod(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;
move-result-object v7
iput-object v7, p0, Lio/dcloud/nineoldandroids/util/ReflectiveProperty;->mGetter:Ljava/lang/reflect/Method;
.line 26
invoke-virtual {v7, v6}, Ljava/lang/reflect/Method;->setAccessible(Z)V
:try_end_67
.catch Ljava/lang/NoSuchMethodException; {:try_start_5e .. :try_end_67} :catch_ad
.line 46
:goto_67
iget-object p3, p0, Lio/dcloud/nineoldandroids/util/ReflectiveProperty;->mGetter:Ljava/lang/reflect/Method;
invoke-virtual {p3}, Ljava/lang/reflect/Method;->getReturnType()Ljava/lang/Class;
move-result-object p3
.line 48
invoke-direct {p0, p2, p3}, Lio/dcloud/nineoldandroids/util/ReflectiveProperty;->typesMatch(Ljava/lang/Class;Ljava/lang/Class;)Z
move-result v7
if-eqz v7, :cond_8f
.line 52
new-instance p2, Ljava/lang/StringBuilder;
const-string v0, "set"
invoke-direct {p2, v0}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V
invoke-virtual {p2, v5}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {p2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object p2
:try_start_81
new-array v0, v6, [Ljava/lang/Class;
aput-object p3, v0, v4
.line 56
invoke-virtual {p1, p2, v0}, Ljava/lang/Class;->getDeclaredMethod(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;
move-result-object p1
iput-object p1, p0, Lio/dcloud/nineoldandroids/util/ReflectiveProperty;->mSetter:Ljava/lang/reflect/Method;
.line 57
invoke-virtual {p1, v6}, Ljava/lang/reflect/Method;->setAccessible(Z)V
:try_end_8e
.catch Ljava/lang/NoSuchMethodException; {:try_start_81 .. :try_end_8e} :catch_8e
:catch_8e
return-void
.line 58
:cond_8f
new-instance p1, Lio/dcloud/nineoldandroids/util/NoSuchPropertyException;
new-instance v4, Ljava/lang/StringBuilder;
invoke-direct {v4, v3}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V
invoke-virtual {v4, p3}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder;
invoke-virtual {v4, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
.line 59
invoke-virtual {v4, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v4, p2}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder;
invoke-virtual {v4, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v4}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object p2
.line 60
invoke-direct {p1, p2}, Lio/dcloud/nineoldandroids/util/NoSuchPropertyException;-><init>(Ljava/lang/String;)V
throw p1
.line 61
:catch_ad
:try_start_ad
invoke-virtual {p1, p3}, Ljava/lang/Class;->getField(Ljava/lang/String;)Ljava/lang/reflect/Field;
move-result-object p1
iput-object p1, p0, Lio/dcloud/nineoldandroids/util/ReflectiveProperty;->mField:Ljava/lang/reflect/Field;
.line 62
invoke-virtual {p1}, Ljava/lang/reflect/Field;->getType()Ljava/lang/Class;
move-result-object p1
.line 63
invoke-direct {p0, p2, p1}, Lio/dcloud/nineoldandroids/util/ReflectiveProperty;->typesMatch(Ljava/lang/Class;Ljava/lang/Class;)Z
move-result v4
if-eqz v4, :cond_be
return-void
.line 64
:cond_be
new-instance v4, Lio/dcloud/nineoldandroids/util/NoSuchPropertyException;
new-instance v5, Ljava/lang/StringBuilder;
invoke-direct {v5, v3}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V
invoke-virtual {v5, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder;
invoke-virtual {v5, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
.line 65
invoke-virtual {v5, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v5, p2}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder;
invoke-virtual {v5, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v5}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object p1
.line 66
invoke-direct {v4, p1}, Lio/dcloud/nineoldandroids/util/NoSuchPropertyException;-><init>(Ljava/lang/String;)V
throw v4
:try_end_dc
.catch Ljava/lang/NoSuchFieldException; {:try_start_ad .. :try_end_dc} :catch_dc
.line 72
:catch_dc
new-instance p1, Lio/dcloud/nineoldandroids/util/NoSuchPropertyException;
new-instance p2, Ljava/lang/StringBuilder;
const-string v0, "No accessor method or field found for property with name "
invoke-direct {p2, v0}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V
.line 73
invoke-virtual {p2, p3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {p2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object p2
.line 74
invoke-direct {p1, p2}, Lio/dcloud/nineoldandroids/util/NoSuchPropertyException;-><init>(Ljava/lang/String;)V
throw p1
.end method
.method private typesMatch(Ljava/lang/Class;Ljava/lang/Class;)Z
.registers 6
.annotation system Ldalvik/annotation/Signature;
value = {
"(",
"Ljava/lang/Class<",
"TV;>;",
"Ljava/lang/Class;",
")Z"
}
.end annotation
const/4 v0, 0x1
if-eq p2, p1, :cond_4d
.line 1
invoke-virtual {p2}, Ljava/lang/Class;->isPrimitive()Z
move-result v1
const/4 v2, 0x0
if-eqz v1, :cond_4c
.line 2
sget-object v1, Ljava/lang/Float;->TYPE:Ljava/lang/Class;
if-ne p2, v1, :cond_12
const-class v1, Ljava/lang/Float;
if-eq p1, v1, :cond_4b
.line 3
:cond_12
sget-object v1, Ljava/lang/Integer;->TYPE:Ljava/lang/Class;
if-ne p2, v1, :cond_1a
const-class v1, Ljava/lang/Integer;
if-eq p1, v1, :cond_4b
.line 4
:cond_1a
sget-object v1, Ljava/lang/Boolean;->TYPE:Ljava/lang/Class;
if-ne p2, v1, :cond_22
const-class v1, Ljava/lang/Boolean;
if-eq p1, v1, :cond_4b
.line 5
:cond_22
sget-object v1, Ljava/lang/Long;->TYPE:Ljava/lang/Class;
if-ne p2, v1, :cond_2a
const-class v1, Ljava/lang/Long;
if-eq p1, v1, :cond_4b
.line 6
:cond_2a
sget-object v1, Ljava/lang/Double;->TYPE:Ljava/lang/Class;
if-ne p2, v1, :cond_32
const-class v1, Ljava/lang/Double;
if-eq p1, v1, :cond_4b
.line 7
:cond_32
sget-object v1, Ljava/lang/Short;->TYPE:Ljava/lang/Class;
if-ne p2, v1, :cond_3a
const-class v1, Ljava/lang/Short;
if-eq p1, v1, :cond_4b
.line 8
:cond_3a
sget-object v1, Ljava/lang/Byte;->TYPE:Ljava/lang/Class;
if-ne p2, v1, :cond_42
const-class v1, Ljava/lang/Byte;
if-eq p1, v1, :cond_4b
.line 9
:cond_42
sget-object v1, Ljava/lang/Character;->TYPE:Ljava/lang/Class;
if-ne p2, v1, :cond_4c
const-class p2, Ljava/lang/Character;
if-eq p1, p2, :cond_4b
goto :goto_4c
:cond_4b
return v0
:cond_4c
:goto_4c
return v2
:cond_4d
return v0
.end method
# virtual methods
.method public get(Ljava/lang/Object;)Ljava/lang/Object;
.registers 4
.annotation system Ldalvik/annotation/Signature;
value = {
"(TT;)TV;"
}
.end annotation
.line 1
iget-object v0, p0, Lio/dcloud/nineoldandroids/util/ReflectiveProperty;->mGetter:Ljava/lang/reflect/Method;
if-eqz v0, :cond_1b
const/4 v1, 0x0
.line 3
:try_start_5
invoke-virtual {v0, p1, v1}, Ljava/lang/reflect/Method;->invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;
move-result-object p1
:try_end_9
.catch Ljava/lang/IllegalAccessException; {:try_start_5 .. :try_end_9} :catch_15
.catch Ljava/lang/reflect/InvocationTargetException; {:try_start_5 .. :try_end_9} :catch_a
return-object p1
:catch_a
move-exception p1
.line 7
new-instance v0, Ljava/lang/RuntimeException;
invoke-virtual {p1}, Ljava/lang/reflect/InvocationTargetException;->getCause()Ljava/lang/Throwable;
move-result-object p1
invoke-direct {v0, p1}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/Throwable;)V
throw v0
.line 8
:catch_15
new-instance p1, Ljava/lang/AssertionError;
invoke-direct {p1}, Ljava/lang/AssertionError;-><init>()V
throw p1
.line 12
:cond_1b
iget-object v0, p0, Lio/dcloud/nineoldandroids/util/ReflectiveProperty;->mField:Ljava/lang/reflect/Field;
if-eqz v0, :cond_2a
.line 14
:try_start_1f
invoke-virtual {v0, p1}, Ljava/lang/reflect/Field;->get(Ljava/lang/Object;)Ljava/lang/Object;
move-result-object p1
:try_end_23
.catch Ljava/lang/IllegalAccessException; {:try_start_1f .. :try_end_23} :catch_24
return-object p1
.line 16
:catch_24
new-instance p1, Ljava/lang/AssertionError;
invoke-direct {p1}, Ljava/lang/AssertionError;-><init>()V
throw p1
.line 20
:cond_2a
new-instance p1, Ljava/lang/AssertionError;
invoke-direct {p1}, Ljava/lang/AssertionError;-><init>()V
throw p1
.end method
.method public isReadOnly()Z
.registers 2
.line 1
iget-object v0, p0, Lio/dcloud/nineoldandroids/util/ReflectiveProperty;->mSetter:Ljava/lang/reflect/Method;
if-nez v0, :cond_a
iget-object v0, p0, Lio/dcloud/nineoldandroids/util/ReflectiveProperty;->mField:Ljava/lang/reflect/Field;
if-nez v0, :cond_a
const/4 v0, 0x1
return v0
:cond_a
const/4 v0, 0x0
return v0
.end method
.method public set(Ljava/lang/Object;Ljava/lang/Object;)V
.registers 6
.annotation system Ldalvik/annotation/Signature;
value = {
"(TT;TV;)V"
}
.end annotation
.line 1
iget-object v0, p0, Lio/dcloud/nineoldandroids/util/ReflectiveProperty;->mSetter:Ljava/lang/reflect/Method;
if-eqz v0, :cond_1f
const/4 v1, 0x1
:try_start_5
new-array v1, v1, [Ljava/lang/Object;
const/4 v2, 0x0
aput-object p2, v1, v2
.line 3
invoke-virtual {v0, p1, v1}, Ljava/lang/reflect/Method;->invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;
:try_end_d
.catch Ljava/lang/IllegalAccessException; {:try_start_5 .. :try_end_d} :catch_19
.catch Ljava/lang/reflect/InvocationTargetException; {:try_start_5 .. :try_end_d} :catch_e
goto :goto_26
:catch_e
move-exception p1
.line 7
new-instance p2, Ljava/lang/RuntimeException;
invoke-virtual {p1}, Ljava/lang/reflect/InvocationTargetException;->getCause()Ljava/lang/Throwable;
move-result-object p1
invoke-direct {p2, p1}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/Throwable;)V
throw p2
.line 8
:catch_19
new-instance p1, Ljava/lang/AssertionError;
invoke-direct {p1}, Ljava/lang/AssertionError;-><init>()V
throw p1
.line 12
:cond_1f
iget-object v0, p0, Lio/dcloud/nineoldandroids/util/ReflectiveProperty;->mField:Ljava/lang/reflect/Field;
if-eqz v0, :cond_2d
.line 14
:try_start_23
invoke-virtual {v0, p1, p2}, Ljava/lang/reflect/Field;->set(Ljava/lang/Object;Ljava/lang/Object;)V
:try_end_26
.catch Ljava/lang/IllegalAccessException; {:try_start_23 .. :try_end_26} :catch_27
:goto_26
return-void
.line 16
:catch_27
new-instance p1, Ljava/lang/AssertionError;
invoke-direct {p1}, Ljava/lang/AssertionError;-><init>()V
throw p1
.line 19
:cond_2d
new-instance p1, Ljava/lang/UnsupportedOperationException;
new-instance p2, Ljava/lang/StringBuilder;
const-string v0, "Property "
invoke-direct {p2, v0}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V
invoke-virtual {p0}, Lio/dcloud/nineoldandroids/util/Property;->getName()Ljava/lang/String;
move-result-object v0
invoke-virtual {p2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
const-string v0, " is read-only"
invoke-virtual {p2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {p2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object p2
invoke-direct {p1, p2}, Ljava/lang/UnsupportedOperationException;-><init>(Ljava/lang/String;)V
throw p1
.end method