2016-06-24 2 views
-3

Я использую этот код для чтения частных полей в Java, чтобы позже передать их в Maps for bukkit.Может только использовать код фрагмента дважды до получения ошибок

Field FieldF = net.minecraft.server.v1_9_R2.EntityTypes.class.getDeclaredField("F"); 
    FieldF.setAccessible(true); 
    Object valueF = FieldF.get("valueF"); 

Однако, когда я делаю это, попробуйте еще раз, я получаю ошибки.

Unhandled exception type NoSuchFieldException 

enter image description here

После того, как я добавить бросает декларации throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException я получаю другую ошибку: enter image description here

После добавить бросками NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException

enter image description here

Как я могу использовать первый код без всяких ошибки? Я могу использовать его только два раза, прежде чем я получу ошибку.

Полный код:

package io.github.rookietec9.EnderPlugin.Entities; 

import java.lang.reflect.Field; 
import java.util.Map; 

import org.bukkit.Location; 
import org.bukkit.World; 

import net.minecraft.server.v1_9_R2.Entity; 

public enum CustomBase { 

// NAME("Entity name", Entity ID, yourcustomclass.class) 

CUSTOM_SKELETON("Skeleton", 54, CustomSkeleton.class); // You can add as 
                 // many as you want. 

private CustomBase(String name, int id, Class<? extends Entity> custom) { 
    addToMaps(custom, name, id); 
} 

public static void spawnEntity(Entity entity, Location loc) { 
    Location Loc = new Location((World) entity.getWorld(), loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), 
      loc.getPitch()); 
    spawnEntity(entity, Loc); 
} 

@SuppressWarnings({ "rawtypes", "unchecked" }) 
private static void addToMaps(Class clazz, String name, int id) { 
    // Remove the lines with // in front of them if you want to override 
    // default entities (You'd have to remove the default entity from the 
    // map first though). 
    Field FieldF = net.minecraft.server.v1_9_R2.EntityTypes.class.getDeclaredField("F"); 
    FieldF.setAccessible(true); 
    Object valueF = FieldF.get("valueF"); 
    Field FieldC = net.minecraft.server.v1_9_R2.EntityTypes.class.getDeclaredField("D"); 
    FieldC.setAccessible(true); 
    Object valueC = FieldC.get("valueC"); 
    Field FieldD = net.minecraft.server.v1_9_R2.EntityTypes.class.getDeclaredField("C"); 
    FieldD.setAccessible(true); 
    Object valueD = FieldD.get("valueD"); 



    ((Map) valueC).put(name, clazz); 
    ((Map) valueD).put(clazz, name); 
    ((Map) valueF).put(clazz, Integer.valueOf(id)); 
    // ((Map)getPrivateField("e", 
    // net.minecraft.server.v1_7_R4.EntityTypes.class, 
    // null)).put(Integer.valueOf(id), clazz); 
    // ((Map)getPrivateField("g", 
    // net.minecraft.server.v1_7_R4.EntityTypes.class, null)).put(name, 
    // Integer.valueOf(id)); 
} 

} 

ответ

1

Во-первых, узнать немного Java. https://docs.oracle.com/javase/tutorial/essential/exceptions/

Использование попытаться/поймать блоков вместо бросков деклараций в addToMaps()

Пример:

Class clazz = null; 
try{ 
    clazz = Class.forName("YourClass"); 
} catch (ClassNotFoundException e){ 
    e.printStackTrace(); 
} 
1

Во-первых, ваше использование отражение не совсем правильно. Вот как это должно быть настроено:

// field.get(Object reference) = gets the field value of the given instance 
Object ref = MyApplication.getExample(); 
Field f = Example.class.getField("exampleField"); 
f.setAccessible(true); 
Object val = f.get(ref); 

// If the field is static you don't need a reference 
Field staticField = Example.class.getField("staticField"); 
staticField.setAccessible(true); 
Object val = staticField.get(null); 

Что касается синтаксиса, вы вызываете методы, которые генерируют исключения. Вам нужно будет обработать их с помощью try-catch. Если ваш конструктор выдает исключения, вы не сможете создать эти константы перечисления.

Не связанные с ошибками имена капитализированных переменных не улыбаются. Также нет заглавных букв.

Смежные вопросы