2014-12-02 6 views
0

타사 jar 파일에있는 보호 된 메서드를 재정의 할 수 있는지 궁금합니다. 리플렉션을 사용하여 메소드를 호출 할 수 있다고 생각하지만 완전히 덮어 쓰는 방법은 무엇입니까?보호 된 메서드 내에서 코드 수정

방법은

protected void a(World world, int i, int j, int k, ItemStack itemstack) { 
    if (!world.isStatic && world.getGameRules().getBoolean("doTileDrops")) { 
     float f = 0.7F; 
     double d0 = (double) (world.random.nextFloat() * f) + (double) (1.0F - f) * 0.5D; 
     double d1 = (double) (world.random.nextFloat() * f) + (double) (1.0F - f) * 0.5D; 
     double d2 = (double) (world.random.nextFloat() * f) + (double) (1.0F - f) * 0.5D; 
     EntityItem entityitem = new EntityItem(world, (double) i + d0, (double) j + d1, (double) k + d2, itemstack); 
     entityitem.pickupDelay = 10; 
     world.addEntity(entityitem); 
    } 
} 
+0

자신이 속한 클래스에서 상속 된 경우 자신의 패키지 외부에서 보호 된 메서드를 '재정의 (override)'할 수 있습니다. –

+1

질문을받지 못했습니다. 보호 된 메서드 인 경우 클래스를 확장하여 재정의 할 수 있습니다. Check [Java Access Modifiiers] (http://www.tutorialspot.com/java/java_access_modifiers.htm) – Vikas

+0

나는 그것을 무시할 수 있다는 것을 알고 있지만, 다른 플러그인이 재정의 된 메소드를 사용하는 방법을 모른다. – 97WaterPolo

답변

0

예, protected 방법의 포인트는 서로 다른 패키지 서브 클래스 구현에 의해 무시 될 수 있다는 것입니다/모듈 (기본 액세스 모드를 수행 할 수 있습니다 만 같은 패키지에서) .

슈퍼 메서드로 다시 호출할지 여부를 결정하는 것은 하위 클래스까지입니다.

그래서 당신은 물론

class MyVersion extends TheClass { 

    @Override 
    protected void a(World world, int i, int j, int k, ItemStack itemstack) { 
     // do something else 
    } 

} 

을 가질 수, 더 흥미로운 질문은 응용 프로그램의 나머지 부분은 대신 원래의 새 버전을 사용하는 방법입니다. 이 개체의 인스턴스화를 유도하는 코드가 있다면 문제가되지 않습니다. 그렇지 않으면 일부 구성 설정을 찾거나 더 많은 코드를 변경해야 할 수 있습니다.

+0

은 '동일한'패키지 여야합니다. – Mavlarn

+0

그래, 그게 효과가있을 거라 생각하지만 다른 모든 플러그인 강제로 내 버전을 사용하는 방법을 모르겠다. 그래서 나는 서버 자체가 시작될 때 대체 할 수 있기를 바랬다. 다른 플러그인이이 메소드에 액세스 할 때, 그런 다음 새로운 것을 사용할 것입니다. – 97WaterPolo

+0

jar 파일을 패치 된 버전으로 대체해야 할 수도 있습니다. 세부 사항 없이는 알기가 어렵습니다. – Thilo